我想从.net核心mvc迁移到razor页面所以我正在构建演示应用程序,我尝试使用mvc我使用的功能,当我尝试使用局部视图基于ajax请求重新加载页面的某些部分时我坚持了一点。有时部分视图非常简单,如下例所示,有时非常复杂(它可以包含带有表单等的其他嵌套部分视图,并且令人惊讶的是它运行良好)。
我的CustomersModel:PageModel处理程序看起来像
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更复杂的项目?
为了解决技术问题,请尝试以下版本的方法:
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应用程序简单得多,这是一件好事,对吧?