Могу ли я изменить имя HTML, сгенерированное Html.DropDownListFor? - PullRequest
25 голосов
/ 29 декабря 2011

IDI использует следующий код для создания выпадающего списка:

 @for (var index = 0; index < Model.AdminSummaries.Count(); index++) 
            { 
            <div class="rep_tr0"> 
                <div class="rep_td0"> 
                    @Html.DropDownListFor(x => Model.AdminSummaries[index].Status, AdminStatusReference.GetAdminStatusOptions()) 
                </div> 

Код создает следующее:

<select id="AdminSummaries_2__Status" name="AdminSummaries[2].Status">
   <option value="1">Released</option>
   <option value="2">Review</option>
   <option value="3">New</option>
</select> 
<select id="AdminSummaries_3__Status" name="AdminSummaries[3].Status">
   <option value="1">Released</option>
   <option value="2">Review</option>
   <option value="3">New</option>
</select> 

Есть ли способ, которым я мог бы изменить его, чтобы он создавал ID"Status_2", "Status_3" и т. Д.

Ответы [ 9 ]

73 голосов
/ 21 августа 2013

Как @Anar сказал в комментариях;

На самом деле, вы можете изменить атрибут имени так же, как и идентификатор, но вместо «имя» используйте «Имя». Удивительно, но это работает.

 @Html.DropDownListFor(x => Model.AdminSummaries[index].Status, 
AdminStatusReference.GetAdminStatusOptions(), 
new { id = string.Format("Status_{0}",index ), Name = "GiveName" });
9 голосов
/ 30 апреля 2014

Иногда помощники HTML не помогают.DropDownListFor кодирование может очень быстро усложниться, и, в конце концов, это просто рендеринг HTML, поэтому иногда лучше пойти в старую школу

<select name="myname" class="dropdownlist" id="myid">
    @foreach (SelectListItem item in Model.SomeSelectList) {
        if (item.Value ==  Model.theValue) {
            <option value="@(item.Value)" selected="selected">@item.Text</option>
        } else {
            <option value="@(item.Value)">@item.Text</option>
        }
    }
</select>
5 голосов
/ 15 марта 2017

Для тех, кто интересуется, почему это не работает, все зависит от регистра, и перед ним нужен знак @ ...

Итак, это работает:

new { @id = "myID", @Name = "myName", @Value = "myValue", @class = "form-control", @onchange = "javascript:DoSomething(this.value);" }

И это не так (обратите внимание на строчную букву 'n' в @name)

new { @id = "myID", @name = "myName", @Value = "myValue", @class = "form-control", @onchange = "javascript:DoSomething(this.value);" }
5 голосов
/ 29 декабря 2011

Вы можете установить / изменить идентификатор так же, как любой атрибут HTML (но не имя, которое я нашел).

@Html.DropDownListFor(x => Model.AdminSummaries[index].Status, AdminStatusReference.GetAdminStatusOptions(), new { id = string.Format("Status_{0}",index ) });
2 голосов
/ 12 января 2017

Просто используйте «Имя» вместо «имя», и оно работает.

@Html.DropDownList("ClassID", null, "Select Class", htmlAttributes: new { id = _id, Name =_id, @class = "form-control" })
2 голосов
/ 08 июля 2013

ID может быть изменен, как описано @Arbiter. Однако, если вы хотите изменить имя, тогда я думаю, что вам нужно использовать @Html.DropDownList вместо @Html.DropDownListFor. Это лишает вас всех преимуществ наличия строгой типизации для элемента свойства, но так как простое изменение идентификаторов означает, что вы не можете получить доступ к значениям осмысленным образом, если посмотреть на ответ Request.Form, это может быть приемлемым решением для вас.

1 голос
/ 23 мая 2019

Вам нужно перейти с DropDownListFor на DropDownList. Чем легко поменять имя.

@Html.DropDownList("YourName", SelectList, new { @id = "YourId", @class = "YourClass" })

Надеюсь, это сработает.

1 голос
/ 13 августа 2015

Спасибо .. это работает ... добавление. Имя изменить имя атрибута html пароля

      @Html.PasswordFor(Function(model) model.password, New With {.Autocomplete = "off", .Name = "oldpassword", .id = "oldpassword", .value = Model.password, .readonly = True})
0 голосов
/ 16 сентября 2015

Мое решение этой проблемы - заменить идентификатор и имя после DropDownListFor () методом расширения html-помощника.

        public static MvcHtmlString ReplaceIdAndName(this MvcHtmlString htmlSource, string name)
    {
        MvcHtmlString result;
        if (name == null)
            result = htmlSource;
        else
        {
            string id = name.Replace("[", "_").Replace("]", "_").Replace(".", "_");  // HTML ids cannot have []. so MVC convention replaces with _
            XDocument html = XDocument.Parse(htmlSource.ToHtmlString());
            html.Elements().Select(e => e.Attribute("id")).FirstOrDefault().SetValue(id);
            html.Elements().Select(e => e.Attribute("name")).FirstOrDefault().SetValue(name);
            result = MvcHtmlString.Create(html.ToString());
        }
        return result;
    }


DropDownListFor(...).ReplaceIdAndName("myclass[1].myprop");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...