Мне было любопытно, почему конкретное переопределение атрибута имени не сработает. Если я не написал это с заглавной буквы (т.е. 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);
Здесь мы видим, что проблема в том, что независимо от того, какое свойство name вы укажете, оно будет переопределено последним вызовом MergeAttribute
, который будет использовать любую логику, которая присваивается переменной fullName
из метода GetFullHtmlFieldName
.
Я как бы понимаю, почему они применяют такое поведение, предполагая, что это как-то связано с контролем имен, используемых в обратной передаче, чтобы гарантировать, что это работает с связывателем модели.
В любом случае, чтобы это произошло, я просто создаю элемент ввода вручную и не использую помощника представления бритвы.
person
sovemp
schedule
22.02.2017