ASP.NET MVC 3: переопределить атрибут «имя» с помощью TextBoxFor

99

Можно ли при использовании Html.TextBoxForпереопределить атрибут имени?

Я безуспешно пытался. Мне нужно использовать TextBoxFor, чтобы проверка на стороне клиента работала, однако по причинам, в которые я не буду вдаваться, мне нужно, чтобы имя текстового поля отличалось от сгенерированного.

Я пробовал следующее:

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

Что работает для идентификатора, но не для имени. Это возможно?

Обновление : изучение кода TextBoxFor. Не похоже, что есть простой способ. Надеюсь, кто-нибудь докажет, что я ошибаюсь.

Роб Стивенсон-Леггетт
источник
Что такое тип данных «Данные»
архил
Дубликат stackoverflow.com/questions/6920935/… и stackoverflow.com/questions/6064363/…
Фернандо Коррейя
2
Эти вопросы задают несколько иное. Кроме того - это более старый из трех, так что я думаю, вы имеете в виду дублированный.
Роб Стивенсон-Леггетт,

Ответы:

234

Роб, на самом деле есть гораздо более простой способ. Вместо имени используйте имя :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })
Анар Халилов
источник
11
С учетом регистра это @highwingers, эта крошечная деталь может сэкономить часы.
анар халилов
3
Overkill .. Имя, но идентификатор X_X
Владимирс
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
Сэкономил бы мне часы, если бы нашел это несколько часов назад, ха-ха
Джони Карр
Интересно, но нет перегрузки для атрибута name для подобных помощников, таких как DropDownListFor, вы должны указать его в параметре атрибутов html (с заглавной N в имени).
nmit026
8

Попробуйте EditorFor . вы можете передать строку в качестве имени шаблона, если хотите, чтобы текстовое поле отображалось, даже если тип свойства не является строкой. Если свойство уже является строкой, ему не нужно templatenameявно отображать текстовое поле, поэтому вы можете пройти null. Обратите внимание, что для него явно не требуется параметр id, он будет выводить его из имени элемента. И все функции проверки по-прежнему активны с EditorFor

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")
Archil
источник
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")
Benwasd
источник
Похоже, простой способ сделать это. Если немного хакерство :-)
Роб Стивенсон-Леггетт
ммм, таким образом, вы бы предпочли просто взять обычный 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" })

Не уверен, какой из этих двух строковых параметров в середине работает, но это сработало только тогда, когда я ввел их оба.

Мистер Айдос
источник
Это идентификатор и имя. это сработало для меня. Я прошел все ответы выше, и ни один из них не работал, но это 1. Спасибо.
Orion
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" }
ТройСтивен
источник