2013-06-02 3 views
4

У меня проблема, в основном у меня есть форма с большим количеством полей в ней, и у всех из них есть необходимый набор атрибутов, поэтому, когда вы просто оставите его пустым и нажмите «ОК» , вы получаете подтверждение на стороне клиента, и оно становится красным. Это слово отлично подходит для всего, кроме EditorTemplate.Шаблон редактора MVC3 не генерирует проверку на стороне клиента

Моя модель имеет следующий вид:

public class MyModel 
{ 
    [Required] 
    public string Username{get;set;} 

    public Location Loc{get;set;} 
} 

public class Location 
{ 
    [Required] 
    public string Loc1{get;set;} 
    [Required] 
    public string Loc2{get;set;} 
} 

я следующий в моем главном экране:

@Html.EditorFor(m => m.Location, Model.Location) 

А вот мой EditorTemplate:

<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.Loc1) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.Loc1, Model.Locs==null?Enumerable.Empty<SelectListItem>():Model.Locs, "---select--", new { @class = "location-ddl" }) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.Loc1) 
    </td> 
</tr> 

...

После расследования нг это thouroughtly я заметил, что HTML это prodcues следующая:

<select name="Location.Loc1" id="Location_Loc1"> 

Как вы можете видеть это не хватает некоторых атрибутов для проверки на стороне клиента, как правило, это должно быть так:

<select name="Loc1" id="Loc1" data-val-required="The Loc1field is required." data-val="true"> 

Мой вопрос , почему шаблон редактора не генерирует правильный вывод html с проверкой на стороне клиента и как его исправить?

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

Благодаря

+1

действительно ли проверка на стороне клиента работает для свойства 'UserName'? – Shyju

+0

Да, это работает! – Alnedru

+0

Никто не сталкивался с такой проблемой? – Alnedru

ответ

1

Вы можете использовать Html.GetUnobtrusiveValidationAttributes("Location.Loc1") для получения атрибутов проверки. См. Документацию here.

0

Я думаю, что использование Html.GetUnobtrusiveValidationAttributes() должно быть объяснено более подробно.

Если предположить, что ваш шаблон модель Редактор Location, вы должны были добавить следующий блок кода в верхней части файла:

@{ 
    IDictionary<string, Object> htmlAttributeValuePairsLoc1 = Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m=>m.Loc1).ToHtmlString()); 
    htmlAttributeValuePairsLoc1.Add("class","location-ddl"); 

    IDictionary<string, Object> htmlAttributeValuePairsLoc2 = Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m=>m.Loc1).ToHtmlString()); 
    htmlAttributeValuePairsLoc2.Add("class","location-ddl"); 
} 

Теперь вы можете придать соответствующий словарь в свой HtmlHelpers, как это :

<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.Loc1) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.Loc1, 
       Model.Locs??Enumerable.Empty<SelectListItem>(), 
       "---select--", 
       htmlAttributeValuePairsLoc1) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.Loc1) 
    </td> 
</tr> 

PS Html.NameFor() появился в MVC4, но вы можете получить имя собственности, используя Отражение.

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

  • Нет связанных вопросов^_^