Вернуть PartialView в JsonResult - PullRequest
       27

Вернуть PartialView в JsonResult

2 голосов
/ 14 апреля 2019

Я думаю о переходе с .net core mvc на бритвенные страницы , поэтому я создаю демонстрационное приложение, где я пробую функции из mvc, которые я использовал, и немного застрял, когда я попытка перезагрузить некоторую часть страницы на основе AJAX-запроса, используя частичное представление. Иногда частичное представление очень простое, как в следующем примере, а иногда очень сложное (оно может содержать дополнительные вложенные частичные представления с формами и т. Д., Что удивительно хорошо работает).

Моя CustomersModel: обработчик PageModel выглядит как

  • он возвращает JsonResult, потому что мне нужны отзывы об ошибках
  • иногда я возвращаю более одного частичного представления
public JsonResult OnGetCustomerDetailPartialView(int id)
{
    PopulateCustomers();

    var model = new PartialViews.CustomerDetailViewModel()
    {
        Customer = Customers.Where(x => x.Id == id).FirstOrDefault()
    };

    var partialView = PartialViewHelper.PartialView("/PartialViews/CustomerDetailViewModel.cs", model, ViewData, TempData);

    return new JsonResult(new { success = true, html = partialView.ToStringExtension() });
}

Помощник по частичному просмотру

public static class PartialViewHelper
    {
        public static PartialViewResult PartialView(string viewName, object model,
            ViewDataDictionary viewData, ITempDataDictionary tempData)
        {
            viewData.Model = model; <-- this line throws error

            return new PartialViewResult()
            {
                ViewName = viewName,
                ViewData = viewData,
                TempData = tempData
            };
        }
    }

и проблема в том, что я получил ошибку

System.InvalidOperationException: 'Элемент модели передан в ViewDataDictionary имеет тип 'RazorPages.PartialViews.CustomerDetailViewModel', но это Экземпляр ViewDataDictionary требует элемент модели типа 'RazorPages.Pages.CustomersModel'. '

То есть ViewData привязан к CustomerModel, можно ли вернуть частичное представление определенного ViewModel?

Суть вопроса в том, стоит ли мне использовать Razor Pages вместо MVC или они предназначены для менее сложных проектов, чем MVC?

1 Ответ

1 голос
/ 16 апреля 2019

В ответ на техническую проблему попробуйте эту версию вашего метода:

public static class PartialViewHelper
{
    public static PartialViewResult PartialView<T>(string viewName, object model, ViewDataDictionary viewData, ITempDataDictionary tempData)
    {
        return new PartialViewResult()
        {
            ViewName = viewName,
            ViewData = new ViewDataDictionary<T>(viewData, model),
            TempData = tempData
        };
    }
}

Затем вызовите его следующим образом (хотя имя частичного представления выглядит неправильномне):

var partialView = PartialViewHelper.PartialView<PartialViews.CustomerDetailViewModel>("/PartialViews/CustomerDetailViewModel.cs", model, ViewData, TempData);

И в ответ на вопрос нижней строки, Razor Pages опирается на MVC.Все, что вы можете сделать с MVC, вы также можете сделать с Razor Pages.Он предназначен заменить MVC для генерации HTML на стороне сервера.Вы можете создать настолько сложное приложение, сколько захотите.Но ваш код, вероятно, будет намного проще, чем эквивалентное приложение MVC, что хорошо, верно?

...