C# 删除索引名称的MVC编辑器
我有一个模型,它是另一个模型的列表,比如ModelList:ModelSingle 在我看来,我正在使用C# 删除索引名称的MVC编辑器,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我有一个模型,它是另一个模型的列表,比如ModelList:ModelSingle 在我看来,我正在使用 @model somenamespace.ModelList @Html.EditorForModel() 这将遍历每个ModelSingle并返回强类型为ModelSingle的EditorTemplate @model somenamespace.ModelSingle @using(Html.BeginForm("Action", "Controller", FormMethod.P
@model somenamespace.ModelList
@Html.EditorForModel()
这将遍历每个ModelSingle并返回强类型为ModelSingle的EditorTemplate
@model somenamespace.ModelSingle
@using(Html.BeginForm("Action", "Controller", FormMethod.Post, new { id = "formname" + Model.ID}))
{
@Html.AntiForgeryToken()
@Html.EditorFor(p => p.SomeField)
@Html.EditorFor(p => p.AnotherField)
}
每个模板都包含一个表单,可用于编辑单个模型。这些与我的控制器方法一起单独发布
public ActionResult(ModelSingle model)
我遇到的问题是模型没有正确绑定。有这样一个模型
public class ModelSingle()
{
public string SomeField { get; set; }
public string AnotherField { get; set; }
}
EditorTemplate被告知它是列表的一部分,所以我得到
<Form>
<input name="[0].SomeField"/>
<input name="[0].AnotherField"/>
<input type="submit" value="Update"/>
</Form>
我不能简单地绑定到ModelList,因为它没有命名ModelList[0]。SomeField,即使它是,我认为除了第一项之外,这对任何东西都不起作用
有没有办法让EditorTemplate忽略它的模型是列表的一部分这一事实,或者强制DropDownListFor、EditorFor等等。。。。仅使用字段名而不在[i]前面加前缀
我知道我可以强制进行Name=“SomeField”更改,但我更希望有一个能够反映模型类本身所做任何更改的解决方案
编辑-根据要求添加了所使用视图和编辑器模板的简化示例。问题与页面模型(列表)生成的输入名称与操作预期的模型(列表中的单个项目)不匹配有关 呈现列表时,默认行为是呈现您向我们显示的索引名称([#]符号)。因为您希望能够发布列表中的任意项目,所以您无法提前知道使用了什么索引。当模型绑定器查看单个对象的请求时,它不会尝试使用索引表示法 我不知道您从用户角度的要求是什么-例如,是否需要页面刷新,但实现这一点的一种方法是为发布的特定项目提供jQuery帖子:
// pass jquery form object in
var postItem = function($form) {
var postBody = {
SomeField: $form.find('input selector') // get your input value for this form
AnotherField: '' // another input select for this item
}
$.ajax({
url:'<your action url>',
type: 'POST',
contentType:"application/json; charset=utf-8",
data: JSON.stringify(postBody),
dataType: 'json',
success: function(response) {
// do something with returned markup/data
}
});
}
您能在视图和模板的顶部显示@model标记吗?谢谢。实际上,我是通过jQueryAjax发布这些项目的(尽管目前只对整个表单进行了简单的序列化)。更新单个项时,控制器中的操作方法将返回带有新值(或任何错误)的EditorTemplate。然后用新的EditorTemplate替换当前的EditorTemplate,Jquery重新绑定以拦截提交。我知道父对象是列表的强类型,但EditorTemplate是单个项的强类型,就像post方法一样,所以我不理解为什么它坚持使用索引名称。简单的序列化就是问题所在:它只使用mvc创建的名称。区别在于,手动序列化将为您提供绑定单个ModelSingle对象所需的名称。关于索引名称:long story short,父页面正在呈现列表,因此它正在为每个项创建索引。由于您使用的是Html.EditorFor*方法,因此在呈现时编辑器模板将透明地从父视图接收索引前缀。通过使用第二个选项(render partial),父视图中的上下文被破坏,因此EditorTemplate不再具有用于构建索引名称的前缀。我希望避免硬编码名称路由,以防由于某种原因在模型中更改字段名称。如果需要,我可以从EditorTemplate中强制输入名称。如果可能的话,我宁愿找到问题的原因,也不愿找到解决办法。如果没有,那么手动输入名称(或根据您的示例添加类选择器)就必须是.Bingo-您在editor上对vs部分破坏索引的解释是正确的。将Html.EditorForModel()更改为foreach(模型中的var singleModel){Html.Partial(singleModel.GetType().Name,singleModel)}使一切工作都非常顺利。谢谢你的帮助。非常感谢。
var inputs = $form.find('all input selector');
var jsonString = '{';
$.each(inputs, function(index, element) {
var parsedName = element.attr('name').chopOffTrailingFieldName();
jsonString += parsedName + ":'" + element.val() + "',";
});
jsonString += '}';