在 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 扩展方法,请参阅