返回JsonResult中的局部视图

问题描述 投票:2回答:1

我想从.net核心mvc迁移到razor页面所以我正在构建演示应用程序,我尝试使用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更复杂的项目?

partial-views razor-pages
1个回答
1
投票

为了解决技术问题,请尝试以下版本的方法:

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。它旨在取代用于服务器端HTML生成的MVC。您可以使用它构建复杂的应用程序。但是你的代码可能比同等的MVC应用程序简单得多,这是一件好事,对吧?

© www.soinside.com 2019 - 2024. All rights reserved.