2015-01-22 2 views
0

Вот код, сгенерированный из мастера «Добавить» Открыть в проекте ASP .NET MVC5:Бритва имеет три различных способа, чтобы установить «класс» атрибут

<div class="form-group"> 
     @Html.LabelFor(model => model.City, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.City, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.City, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

Как вы можете видеть, есть три различных способов, которыми Атрибут class используется для управления html. Почему эта аномалия? Кроме того, один предпочтительнее другого? С уважением.

+1

Использование 'новый {@class = "текст-опасность"}' является типичной для большинства помощников, но 'EditorFor()' 'требует нового {htmlAttributes = new {@class = "form-control"}} '. До MVC5 вы не могли добавлять атрибуты html (за исключением передачи 'дополнительногоViewData' в пользовательский' EditorTemplate'. Я считаю, что '.. new {htmlAttributes = new {...}}' требовалось, чтобы избежать какого-либо потенциального конфликта с перегрузка, которая приняла 'дополнительныйViewData' –

+0

@Peter вы можете увидеть какую-либо разницу в DOM? – Parth

ответ

1

1-й и 3-й являются одинаковыми. Первый - это параметр именования. Вы можете использовать этот способ для большей ясности, но это не требуется.

Но второй пример передает атрибуты html в другой объект, который его агрегирует. И вы не можете использовать этот способ для двух предыдущих. В источниках MVC этот объект преобразуется в KeyValuePair:

if (additionalViewData != null) 
{ 
    foreach (KeyValuePair<string, object> kvp in TypeHelper.ObjectToDictionary(additionalViewData)) 
    { 
     viewData[kvp.Key] = kvp.Value; 
    } 
} 
0

Все они одинаковые!

Я предпочитаю этот htmlAttributes: new { @class = "control-label col-md-2" }, потому что он показывает имя параметра четко. В противном случае, все остальные два варианта хороши.

+1

Это ** НЕ ** то же самое.' @ Html.LabelFor (model => model.City, new {htmlAttributes = new {@class = "control-label col-md-2"}}) 'будет генерировать' '(недопустимый html и no имя класса!) –

Смежные вопросы