确定Ajax Post中的模型类型

时间:2018-07-05 02:01:25

标签: ajax asp.net-mvc asp.net-mvc-4 asp.net-ajax

我有一个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?

1 个答案:

答案 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