ASP.NET MVC 4 переопределяет имя и идентификатор html
Я пытаюсь изменить испущенное имя входа html, созданного @Html.HiddenFor
.
Код, который я использую:
@Html.HiddenFor(e => e.SomeProperty, new { @id = "some_property", @name = "some_property" }
Теперь это работает для id
, однако оно не работает для имени. Теперь мне все равно не нужно id
, мне нужно изменить name
, потому что тот, который отправляется обратно на целевой сервер.
Существует ли
- Свойство, которое я могу применить на
SomeProperty
в моей модели?
- Способ в
Html.HiddenFor
переопределить свойство name
?
Или я застрял, чтобы сделать обычную <input ...>
вручную?
Ответы
Ответ 1
Вам нужно использовать Html.Hidden (или записать <input ...>
вручную) вместо Html.HiddenFor
@Html.Hidden("some_property", Model.SomeProperty, new { @id = "some_property" })
Цель сильно типизированных помощников (например, имя, которое заканчивается именем "Для", как HiddenFor
), - угадать имя ввода для вас из предоставленного выражения. Поэтому, если вы хотите иметь "пользовательское" имя ввода, вы всегда можете использовать обычные помощники, такие как Html.Hidden
, где вы можете явно указать имя.
Принятый ответ от unjuken неверен, поскольку он генерирует недействительный HTML.
Использование этого решения генерирует атрибуты TWOstrong > name
:
<input Name="some_property" name="SomeProperty" id="some_property" type="hidden" value="test" />
Таким образом, у вас будет Name="some_property"
И name="SomeProperty"
, который является INVALID HTML, потому что вход может содержать только атрибут ONE name
! (хотя большинство броузеров берут первый Name="some_property"
и не заботятся о втором...)
Ответ 2
Если вы используете:
@Html.HiddenFor(e = > e.SomeProperty, новый {@id = "some_property", @Name = "some_property" });
Обратите внимание на "N" в @Name. Он будет работать.
Ответ 3
Мне было любопытно, почему именно переопределение атрибута name не будет работать. Если я не использовал его (т.е. new {@Name = 'somename'}
), то он, похоже, не работает. Как указывали другие, это работает только потому, что он генерирует дублированные атрибуты имени, а Chrome очищает его.
Я посмотрел на последний исходный код MVC, чтобы выяснить, что происходит. Рассмотрим следующий сниппер из метода GenerateInput
в DefaultHtmlGenerator.cs
:
var fullName = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);
if (string.IsNullOrEmpty(fullName))
{
throw new ArgumentException(
...
}
var inputTypeString = GetInputTypeString(inputType);
var tagBuilder = new TagBuilder("input");
tagBuilder.TagRenderMode = TagRenderMode.SelfClosing;
tagBuilder.MergeAttributes(htmlAttributes);
tagBuilder.MergeAttribute("type", inputTypeString);
tagBuilder.MergeAttribute("name", fullName, replaceExisting: true);
Мы можем видеть здесь, проблема заключается в том, что независимо от того, какое свойство имени вы предоставляете, он будет отменен последним вызовом MergeAttribute
, который будет использовать любую логику, которая назначает переменной fullName
из GetFullHtmlFieldName
.
Я понимаю, почему они применяют это поведение, предполагая, что это имеет какое-то отношение к управлению именами, используемыми в обратной передаче, чтобы гарантировать, что он работает с привязкой к модели.
В любом случае, чтобы это произошло, я просто вручную создаю элемент ввода и не использую хелпер-представление.