Html.RenderAction с Angular - PullRequest
       40

Html.RenderAction с Angular

0 голосов
/ 28 февраля 2019

Я пытаюсь написать что-то вроде ниже;

Html.RenderAction("Reviews", "Poetry", new { id = "{{ poetry.ID }}" });

Но выдает ошибку типа "Словарь параметров содержит пустую запись для параметра" id "ненулевого типа" System.Int32 "дляметод 'System.Web.Mvc.PartialViewResult "

Но если я напишу что-то вроде ниже, это будет нормально;

var url = Url.Action("Reviews", "Poetry", new { id = "{{ poetry.ID }}" });

Как я могу передать угловое значение в методе Html.RenderAction?

1 Ответ

0 голосов
/ 01 марта 2019

Предположим, вы выполняете действие контроллера следующим образом:

public class PoetryController : Controller
{
    public PartialViewResult Reviews(int id)
    {
        // do something
    }
}

Метод RenderAction анализируется и обрабатывается с сервера перед отправкой в ​​браузер клиента, поэтому ваш первый подход невозможен поскольку угловые выражения, такие как {{ poetry.ID }}, не могут быть должным образом проанализированы серверным кодом в качестве параметра действия, следовательно, он передан как нулевой и вызывает исключение необнуляемого параметра, поскольку id объявлено как int, а не Nullable<int>.

Предполагается, что вы хотите загрузить частичное представление, используя угловое значение (или значение JS), обычно в контроллере используется $http() функция, а затем вызывается имя функции, содержащее HTTP-запрос:

переменная JS в Razor

var pageUrl = '@Url.Action("Reviews", "Poetry")';

Угловая функция

$http({
    method: 'GET',
    url: pageUrl,
    params: {
        id: poetry.ID
    }).then(function (response) {
        // load partial view here
        angular.element('#targetElement').html(response);
    });

Или с использованием сокращенных $http.get(), поскольку RenderAction требуется метод GET для визуализации содержимого частичного представления:

$http.get(pageUrl + '?id=' + poetry.ID).then(function (response) {
    // load partial view here
    angular.element('#targetElement').html(response);
});
...