首页 > 解决方案 > 在 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 将类型的对象发布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 应该将什么类型的模型发布到控制器?

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

解决方案


您的用途是生成具有与相关的属性的Html.Partial()表单控件,而不是。nameMainQueryViewModelHomeListViewModel

首选方法是使用EditorTemplatewhich 将作为name属性的前缀,以便您获得name="MainQuery.someProperty"而不是name="someProperty"当前获得的。

将您的部分名称更改为MainQueryViewModel.cshtml(以匹配类的名称)并将其移动到/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" }})

对于将HtmlHelper其简化为的扩展方法@Html.PartialFor(m => m.MainQuery, "_MainQuery"),请参阅从传递给局部视图的嵌套复杂对象中获取值


推荐阅读