Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除索引名称的MVC编辑器_C#_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

C# 删除索引名称的MVC编辑器

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

我有一个模型,它是另一个模型的列表,比如ModelList:ModelSingle 在我看来,我正在使用

@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 += '}';