Asp.Net MVC强类型集合。编辑器不附加生成的前缀

时间:2012-03-14 13:12:53

标签: asp.net-mvc-3 asp.net-mvc-2 asp.net-mvc-4

我现在正在使用此tutorial

(我相信我的问题与强类型收藏有关......我在互联网上看到的,但我可能错了)

请耐心等待。 :)

我一直遇到这个问题,我在另一个问题question中,答案看起来很好,但是在对代码进行修补之后,我意识到问题在于使用的字段我的自定义局部视图,例如,不要像使用TextBoxFor html帮助的字段那样添加前缀。例如。当我点击添加一个新项目时,它会添加它,但是使用与之前添加的项目相同的ID,那么我的Javascript会失败,因为有两个具有相同ID的项目。

尝试澄清问题的一些代码

部分视图

@model Portal.ViewModels.Micros
@using Portal.Helpers
<div class="editorRow" style="padding-left:5px">
    @using (Html.BeginCollectionItem("micros"))
    {  
        @Html.EditorFor(model => model.Lab_T_ID)
        @Html.EditorFor(model => model.Lab_SD_ID)         
        @Html.TextBoxFor(model => model.Result)
        <input type="button" class="deleteRow" title="Delete" value="Delete" />
    }
</div>

TextBoxFor(Result)呈现为

<input id="micros_5e14bae5-df1b-4c42-9e96-573a8e52f8b2__Result" name="micros[5e14bae5-df1b-4c42-9e96-573a8e52f8b2].Result" type="text" value="">

编辑器用于呈现为

<select id="Lab_SD_ID" multiple="multiple" style="width: 300px; display: none; " >
      <option value="5" selected="selected">Taken at Packing 1</option>
      <option value="6">Taken at Packing 2</option>
      <option value="7">Taken at Packing 3</option>
</select>

 <button type="button" class="ui-multiselect ui-widget ui-state-default ui-corner-all" aria-haspopup="true" tabindex="0" style="width: 300px; ">
<span class="ui-icon ui-icon-triangle-2-n-s"></span><span>Taken at Packing (Winc 4/5-25d)</span></button>

如果需要,我可以包含更多代码,还有一个帮助器类(BeginCollectionItem),我使用它也位于教程中的演示项目中。

我基本上需要了解“微观[5e14bae5-df1b-4c42-9e96-573a8e52f8b2]”。就我所见,它被附加到输入框,但到目前为止已被它难倒:/

1 个答案:

答案 0 :(得分:2)

这适用于TextBoxFor而非自定义EditorFor的原因是因为TextBoxFor助手尊重模板导航上下文,而在编辑器模板中,您只需硬编码一个甚至没有名称的<select>元素。我建议您在生成输入字段时使用HTML帮助程序:

因此,请将自定义模板中的硬编码选项替换为:

@model int?
@{
    var values = ViewData.ModelMetadata.AdditionalValues;
}

<span>    
    @Html.DropDownList(
        "", 
        Enumerable.Empty<SelectListItem>(), 
        new { 
            multiple = "multiple",
            style = "width:" + values["comboboxWidth"] + "px",
            data_url = Url.Action((string)values["action"], (string)values["controller"]),
            data_noneselectedtext = values["noneSelectedText"],
            data_value = values["id"],
            data_text = values["description"]
        }
    )
</span>