Asp.Net MVC Сильно типизированные коллекции. Редактор для не добавления сгенерированного префикса - PullRequest
0 голосов
/ 14 марта 2012

Я сейчас использую этот учебник .

(я считаю, что моя проблема связана со строго типизированными коллекциями ... тем, что я видел в Интернете, но я могу ошибаться)

Пожалуйста, потерпите меня. :)

У меня возникла эта проблема, которую я задал в другом вопросе , ответ казался нормальным, но, немного повозившись с кодом , я понял, что проблема в том, что поля, которые используйте мое частичное представление, не добавляйте к ним префикс, например, поля, которые используют хелпер TextBoxFor html , например. НАПРИМЕР. Когда я нажимаю добавить новый элемент, он добавляет его, но с тем же идентификатором, что и элемент, который был добавлен ранее, тогда мой Javascript завершается ошибкой, потому что есть два элемента с одинаковым идентификатором.

Некоторый код, чтобы попытаться прояснить проблему

Частичный вид

@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 (Результат) отображается как

<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), который я использовал и который также находится в демонстрационном проекте в учебнике.

Мне в основном нужно выяснить, как "micros [5e14bae5-df1b-4c42-9e96-573a8e52f8b2]". насколько я вижу, он добавляется в поля ввода, но до сих пор был озадачен: /

1 Ответ

2 голосов
/ 14 марта 2012

Причина, по которой это работает с 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>
...