ASP.NET MVC 3: Заміна атрибута "name" з TextBoxFor


99

Чи можливо при використанні Html.TextBoxForзмінити атрибут імені?

Я намагався без успіху. Мені потрібно використовувати TextBoxFor, щоб змусити клієнтську перевірку працювати, однак з причин, за які я не вдаватимусь, мені потрібно, щоб ім’я текстового поля було відмінним від створеного.

Я спробував таке:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

Що працює для ідентифікатора, але не імені. Чи можливо це?

Оновлення : вивчаючи код для TextBoxFor. Це не схоже на простий спосіб. Сподіваюся, хтось може довести мене неправильно.


Який тип даних 'Дані'
архів


2
Ці питання задають дещо інше. Також - це старший з трьох, тому я думаю, ви маєте на увазі дублювання.
Роб Стівенсон-Леггетт

Відповіді:


234

Роб, насправді існує набагато простіший спосіб. Замість імені використовуйте Ім'я :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })

11
Залежно від регістру - це @highwingers, ця крихітна деталь може економити години.
анар халілов

3
Overkill .. Ім’я, але ідентифікатор X_X
Vladimirs

2
Дивно, що "id" не відрізняється від регістру (добре працює з id та id), але "name" - ні.
Володимир

10
За допомогою ASP.NET 4, що забезпечує Nameрезультати за двома атрибутами, Nameі name, а модель в'яжучого використовує name.
GSerg

1
Але поводження з двома різними властивостями, назви яких різняться лише залежно від випадку, - це рецепт кошмару технічного обслуговування .....
Джеймс Маккормак

41

Ви це запитуєте, оскільки ви хочете застосувати префікс до імені? Якщо це так, ви можете зробити це, встановивши ViewData.TemplateInfo.HtmlFieldPrefixу своєму контролері.

Я багато чого дізнався про цей матеріал з блогу Бреда Вілсона .


Це схоже на переможця! Гарний.
Роб Стівенсон-Леггетт

2
Так, вони сховали це добре, чи не так :)
Джеймс Маккормак,

Це просто врятувало мені головний біль і дублювання коду.
davidXYZ

13

EditorFor має перевантаження, де ви можете надати nameатрибут як параметр:

 @Html.EditorFor(expression, null, name)

1
Врятували б мене години, якби я знайшов це години тому, ха-ха
Джонні Карр

Цікаво, але не існує перевантаження атрибута імені для подібних помічників, таких як DropDownListFor, ви повинні вказати його в параметрі атрибутів html (з великим написом N в імені).
nmit026

8

Спробуйте редактор для . ви можете передати рядок як ім'я шаблону, якщо ви хочете переконатися, що текстове поле відображається, навіть якщо тип властивості не є рядком. Якщо властивість уже є рядовою, їй не потрібно templatenameявно візуалізувати текстове поле, тому ви можете передати null. Зауважте, що він не вимагає явного параметра явно, він виводить його з імені елемента. І всі функції перевірки досі активні з EditorFor

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")

7

Відповідь Бен отримав мені те, що я шукав, крім того, що вам потрібно загорнути в Html.Raw

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))

4

Це називається Microsoft GOTCHA

Використовуйте назву в кришках, як це

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})

3

трохи "непридатність" =), спробуйте:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

Здається, це приємний простий спосіб зробити це. Якщо трішки хакі :-)
Роб Стівенсон-Леггетт

Гмм, таким чином, ви не хочете скористатися звичайним Html.TexBox .. так як будь-який статичний набір все-таки піде після заміни
різкий Джонні

1

Для мене це працює! Я сподіваюся, що допоможе!

@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })

1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

Не впевнений, який із цих двох рядкових параметрів у середині виконує роботу, але він працював лише тоді, коли я їх набрав.


Це Id та Name. це працювало для мене. Я переглянув усі вищезазначені відповіді і не працював, але це 1. Дякую.
Оріон

public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. Поняття не маю, що templateNameце повинно бути, тому я використав null. Для цього htmlFieldNameя використовував ім'я параметра (в моєму випадку "ipmi" замість "IPMI"). Це зробило для мене трюк.
BCdotWEB

0

У цьому прикладі я вимикав поля форми на основі дозволів, але все ще показував їх. У мене було приховане поле, щоб надіслати значення контролеру, але я хотів інше ім'я поля в EditorFor. Перший параметр після значення моделі представляє властивість "name", другий - нове ім'я.

@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

Призводить до:

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 

0

Нехай це буде просто, для вашого вже наданого ідентифікатора ви просто зможете використовувати метод "TextBox" замість "TextBoxFor", і він буде добре працювати на стороні клієнта та сервера. Крім того, хоча прийнята відповідь спрацює, але створить повторювані атрибути Name на вашому тезі, якщо ви будете перевіряти його за допомогою браузера. Наведене нижче рішення не має такої проблеми.

MvcHtmlString Html.TextBox (назва рядка, значення рядка, об'єкт htmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.