我在从剃刀页面返回部分视图时遇到问题,我的情况是
我有一个局部视图,它是一个表单并且有一个模型。我有 3 个表单驻留在单个 Razor 页面上 表格 A 发布模型 A B 型后模型 B 我的问题是,我想在父页面(即剃刀页面)上处理特定的发布事件。 我如何返回这个部分视图
OnPostModelA(ModelA model)
{
if(! ModelState.IsValid)
return Partialview("_CreateModelA", model);
}
使用剃刀页面可以实现这一点还是不可能? 我只想使用 ajax 返回带有指定模型的局部视图。
如您所知,Razor Pages 在
PartialView
上没有等效的 PageModel
方法。如果您确实想在 PageModel
方法中调用不同的部分视图,只需在您中添加 PartialView
辅助方法 PageModel
:
[NonAction]
public virtual PartialViewResult PartialView(string viewName, object model)
{
ViewData.Model = model;
return new PartialViewResult()
{
ViewName = viewName,
ViewData = ViewData,
TempData = TempData
};
}
这里我使用
ViewData.Model
来存储你的模型对象,假设你的模型类型被命名为 X1Model
:
您可以在部分视图中使用它。
创建一个简单的局部视图,命名为
_CreateModelA.cshtml
:
@model HelloModel
AAAAA
<div>
@Model.Model.Welcome
</div>
和另一个名为
_CreateModelB.cshtml
的部分视图:
@model HelloModel
BBBBBBBB
<div>
@Model.Model.Welcome
</div>
最后,您可以在 PageModel 中返回
PartialView
:
public class HelloModel : PageModel
{
public X1Model Model { get; set; }
public ActionResult OnGet(int rand = 0)
{
var flag = rand % 2 == 0 ? true : false;
var model = new HelloModel() {
Model = new X1Model {
Welcome = "Hello,world",
}
};
if (flag)
{
return PartialView("_CreateModelA", model);
}
else
{
return PartialView("_CreateModelB", model);
}
}
[NonAction]
public virtual PartialViewResult PartialView(string viewName, object model)
{
// ...
}
}
这是屏幕截图:
@if(){
<partial name="" />
}else{
<partial name="" />
}
在 asp dotnet core 2.2 中,Microsoft 在 PageModel 类中添加了一个 Partial 方法,其工作方式与 Controller 类上的 PartialView 方法类似。但是它不允许您将 ViewData 传递给视图。因此,如果您需要这样做,那么您可以像这样创建自己的 PartialViewResult:
var resultViewData = new ViewDataDictionary<YourModelType>(ViewData, model);
resultViewData[YourViewDataProperty] = yourViewDataValue;
return new PartialViewResult
{
ViewName = "_Branch",
ViewData = resultViewData,
TempData = TempData
};
为了复制粘贴目的,方便地结合 @carlin.scott 和 @itminus 的答案,您可以创建此扩展方法:
public static PartialViewResult PartialViewResult<T>(this PageModel page, string viewName, T model)
{
var resultViewData = new ViewDataDictionary<T>(page.ViewData, model);
return new PartialViewResult
{
ViewName = viewName,
ViewData = resultViewData,
TempData = page.TempData
};
}
或者如果您想将其直接放入派生的 PageModel 中,则使用非扩展版本:
public PartialViewResult PartialViewResult<T>(string viewName, T model)
{
var resultViewData = new ViewDataDictionary<T>(ViewData, model);
return new PartialViewResult
{
ViewName = viewName,
ViewData = resultViewData,
TempData = TempData
};
}
这样称呼:
return PartialViewResult("_MyPartial", myPartialModel);