在 Ajax Post 中确定模型类型
Determine model type in Ajax Post
我有一个 ASP.NET MVC 视图。在我的视图中,我想发出 AJAX Post 请求来更新视图内的 PartialView。
这是我的模特:
public class HomeListViewModel
{
public MainQueryViewModel MainQuery { get; set; }
// other properties
}
这是我的视图(有一个 PartialView):
@model MyNameSpace.HomeListViewModel
@using (Ajax.BeginForm("List", new AjaxOptions { UpdateTargetId = "browsePartialView", HttpMethod = "Post" }))
{
@Html.AntiForgeryToken()
<div id="browsePartialView">
@Html.Partial("_MainQuery", Model.MainQuery)
</div>
}
现在这是我的问题:我想要 AJAX 到 POST 类型的对象: HomeListViewModel
到控制器,但是 AJAX Posts MainQuery
.
类型的对象
这是我的控制器操作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult List(HomeListViewModel HomeListViewModel)
{
var myModel = HomeListViewModel; // <-- an empty model is passed in
// some action
}
如果我将参数类型更改为:MainQuery
,那么它可以正常工作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult List(MainQuery MainQuery)
{
var myModel = MainQuery; // <-- all ok
// some action
}
有没有办法告诉 AJAX 控制器应该 post 什么类型的模型?
您对 Html.Partial()
的使用正在生成具有与 MainQueryViewModel
相关的 name
属性的表单控件,而不是 HomeListViewModel
。
首选方法是使用 EditorTemplate
,它会为 name
属性添加前缀,这样您就可以获得 name="MainQuery.someProperty"
而不是当前获得的 name="someProperty"
。
将您的部分名称更改为 MainQueryViewModel.cshtml
(以匹配 class 的名称)并将其移动到 /Views/Shared/EditorTemplates
(或 /Views/yourControllerName/EditorTemplates
)文件夹中,然后生成 html 使用
@Html.EditorFor(m => m.MainQuery)
添加前缀的另一个选项是使用 additionalViewData
传递前缀
@Html.Partial("_MainQuery", Model.MainQuery,
new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "MainQuery" }})
关于将其简化为 @Html.PartialFor(m => m.MainQuery, "_MainQuery")
的 HtmlHelper
扩展方法,请参阅 。
我有一个 ASP.NET MVC 视图。在我的视图中,我想发出 AJAX Post 请求来更新视图内的 PartialView。
这是我的模特:
public class HomeListViewModel
{
public MainQueryViewModel MainQuery { get; set; }
// other properties
}
这是我的视图(有一个 PartialView):
@model MyNameSpace.HomeListViewModel
@using (Ajax.BeginForm("List", new AjaxOptions { UpdateTargetId = "browsePartialView", HttpMethod = "Post" }))
{
@Html.AntiForgeryToken()
<div id="browsePartialView">
@Html.Partial("_MainQuery", Model.MainQuery)
</div>
}
现在这是我的问题:我想要 AJAX 到 POST 类型的对象: HomeListViewModel
到控制器,但是 AJAX Posts MainQuery
.
这是我的控制器操作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult List(HomeListViewModel HomeListViewModel)
{
var myModel = HomeListViewModel; // <-- an empty model is passed in
// some action
}
如果我将参数类型更改为:MainQuery
,那么它可以正常工作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult List(MainQuery MainQuery)
{
var myModel = MainQuery; // <-- all ok
// some action
}
有没有办法告诉 AJAX 控制器应该 post 什么类型的模型?
您对 Html.Partial()
的使用正在生成具有与 MainQueryViewModel
相关的 name
属性的表单控件,而不是 HomeListViewModel
。
首选方法是使用 EditorTemplate
,它会为 name
属性添加前缀,这样您就可以获得 name="MainQuery.someProperty"
而不是当前获得的 name="someProperty"
。
将您的部分名称更改为 MainQueryViewModel.cshtml
(以匹配 class 的名称)并将其移动到 /Views/Shared/EditorTemplates
(或 /Views/yourControllerName/EditorTemplates
)文件夹中,然后生成 html 使用
@Html.EditorFor(m => m.MainQuery)
添加前缀的另一个选项是使用 additionalViewData
@Html.Partial("_MainQuery", Model.MainQuery,
new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "MainQuery" }})
关于将其简化为 @Html.PartialFor(m => m.MainQuery, "_MainQuery")
的 HtmlHelper
扩展方法,请参阅