ajax - 在 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 应该将什么类型的模型发布到控制器?
解决方案
您的用途是生成具有与相关的属性的Html.Partial()
表单控件,而不是。name
MainQueryViewModel
HomeListViewModel
首选方法是使用EditorTemplate
which 将作为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")
,请参阅从传递给局部视图的嵌套复杂对象中获取值。
推荐阅读
- soap - 从 CF10 迁移到 CF2016 后如何使 SOAP 类型不强制小写?
- typescript - 如何生产和使用 Typescript 编写的多模块 NPM 包
- java - java数字模式打印问题
- javascript - jQuery 覆盖事件 preventDefault
- c# - 实体框架中的连接表不能隐式转换类型错误
- python - 如何有条件地将文件转换为 2D numpy 数组?
- php - Twitter REST API – 使用“tweet_mode=extended”参数时出现“无法验证您”错误
- css - 周选择器 CSS
- excel - 一次基于 LastRow 格式化范围列 S 到 Z
- java - 无法绘制模型