Подтвердить что ты не робот

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 ...> вручную?

4b9b3361

Ответ 1

Вам нужно использовать Html.Hidden (или записать <input ...> вручную) вместо Html.HiddenFor

@Html.Hidden("some_property", Model.SomeProperty, new { @id = "some_property" })

Цель сильно типизированных помощников (например, имя, которое заканчивается именем "Для", как HiddenFor), - угадать имя ввода для вас из предоставленного выражения. Поэтому, если вы хотите иметь "пользовательское" имя ввода, вы всегда можете использовать обычные помощники, такие как Html.Hidden, где вы можете явно указать имя.

Принятый ответ от unjuken неверен, поскольку он генерирует недействительный HTML.

Использование этого решения генерирует атрибуты TWO​​strong > 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.

Я понимаю, почему они применяют это поведение, предполагая, что это имеет какое-то отношение к управлению именами, используемыми в обратной передаче, чтобы гарантировать, что он работает с привязкой к модели.

В любом случае, чтобы это произошло, я просто вручную создаю элемент ввода и не использую хелпер-представление.