我有一个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将类型为HomeListViewModel
的对象发布到控制器,但是AJAX发布类型为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应该将哪种类型的模型发布到Controller?
答案 0 :(得分:1)
您对Html.Partial()
的使用正在生成具有name
属性的表单控件,这些属性与MainQueryViewModel
而不是HomeListViewModel
相关。
首选方法是使用一个EditorTemplate
前缀的name
属性,以便您获得name="MainQuery.someProperty"
而不是当前获得的name="someProperty"
。
将部分的名称更改为MainQueryViewModel.cshtml
(以匹配类的名称),然后将其移动到/Views/Shared/EditorTemplates
(或/Views/yourControllerName/EditorTemplates
)文件夹中,并生成html use < / p>
@Html.EditorFor(m => m.MainQuery)
添加前缀的另一种方法是使用additionalViewData
@Html.Partial("_MainQuery", Model.MainQuery,
new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "MainQuery" }})
对于将其简化为HtmlHelper
的{{1}}扩展方法,请参考getting the values from a nested complex object that is passed to a partial view。