【问题标题】:Determine model type in Ajax Post在 Ajax Post 中确定模型类型
【发布时间】:2018-12-13 09:59:38
【问题描述】:

我有一个 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 应该将什么类型的模型发布到控制器?

【问题讨论】:

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


    【解决方案1】:

    您对Html.Partial() 的使用正在生成带有name 属性的表单控件,这些属性与MainQueryViewModel 相关,而不是HomeListViewModel

    首选的方法是使用EditorTemplate,它将作为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" }})
    

    对于将其简化为@Html.PartialFor(m =&gt; m.MainQuery, "_MainQuery")HtmlHelper 扩展方法,请参阅getting the values from a nested complex object that is passed to a partial view

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多