ASP.NET MVC 3: переопределить атрибут «имя» с помощью 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
Владимирс

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")

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" })

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


Это идентификатор и имя. это сработало для меня. Я прошел все ответы выше, и ни один из них не работал, но это 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" }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.