2011-02-03 2 views
6

Добрый вечер у всех есть вопросы относительно проверки значений выпадающего списка. У меня есть представление, связанное с типом модели представления, называемым ReservationData.ASP.NET MVC 3 - вопрос валидации

Этот объект содержит имущество CustomerVehicles типа List<VehicleData>. VehicleData имеет два int объектов недвижимости VehicleMakeId и VehicleModelId.

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

Когда я пытаюсь отправить и подтвердить, я не вижу никаких ошибок проверки, отображаемых на экране.

На всякий случай вам интересно, что я добавил ValidationMessageFor для каждого выпадающего списка. Я не уверен, что это проблема со структурой моей модели представления и ее сложностью и как нужно управлять элементами управления или как нужно устанавливать идентификаторы. Любая помощь будет принята с благодарностью.

Вот код для цикла по коллекции:

@for (var i = 0; i < Model.CustomerVehicles.Count(); i++) 
    { 
     var vehicleNumber = i + 1; 
     <div class="vehicle-selection-wrapper"> 
      <div class="content-container"> 
       <h3> 
        Vehicle @vehicleNumber</h3> 
       <img class="vehicle-image" alt="manufacturer image" src="@Url.Content("~/Content/images/default-vehicle.gif")" /><br /> 
       @Html.LabelFor(m => m.CustomerVehicles[i].VehicleMakeId) 
       @Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleMakeId 
      , new SelectList(Model.VehicleMakes, "Id", "Name") 
          , @UIDisplay.Dropdown_DefaultOption, new { @class = "long-field" })<br /> 
       @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleMakeId)<br /> 
       @Html.LabelFor(m => m.CustomerVehicles[i].VehicleModelId) 
       @Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleModelId 
      , new SelectList(new List<CWR.Domain.VehicleModel>(), "Id", "Name") 
       , @UIDisplay.Dropdown_DefaultOption, new { @class = "long-field" }) 
       @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleModelId) 
      </div> 
     </div> 
    } 

Ok поэтому я также заметил, что в генерируемый HTML выбирает, которые генерируются отсутствуют атрибуты данных-валин HTML5, которые связаны с элементами для обработки валидации. Вот сгенерированный HTML

<select class="long-field" id="CustomerVehicles_0__VehicleMakeId"   name="CustomerVehicles[0].VehicleMakeId"><option value="">-- Select --</option> 
</select><br /> 
<span class="field-validation-valid" data-valmsg- for="CustomerVehicles[0].VehicleMakeId" data-valmsg-replace="true"></span><br /> 
<label for="CustomerVehicles_0__VehicleModelId">Model</label> 
<select class="long-field" id="CustomerVehicles_0__VehicleModelId" name="CustomerVehicles[0].VehicleModelId"><option value="">-- Select --</option> 
</select> 
<span class="field-validation-valid" data-valmsg-for="CustomerVehicles[0].VehicleModelId" data-valmsg-replace="true"></span> 

Кроме того, в моем VehicleData классе VehicleMakeId и VehicleModelId свойства украшены атрибутом Required.

UPDATE:

Ok, так что я испытывал, и заметил, что если я продолжу свой код идентичны, за исключением я поменять Html.DropdownListFor звонки с Html.TextboxFor звонков затем проверки работ. Что может быть причиной этого? Может быть, это ошибка структуры с ненавязчивой проверкой?

UPDATE: Содержит Фикс

Таким образом, после публикации этого же вопроса на ASP.NET Forums, я был в состоянии получить решение. В сообщении вы сможете увидеть, что есть ошибка в ненавязчивой структуре проверки и как она обрабатывает проверку dropdownlists. Пользователь advsellorben неплохо справляется с объяснением проблемы, а также с решением (включая пример кода), которое поможет другим избежать этой проблемы в будущем или, по крайней мере, до тех пор, пока Microsoft не введет исправление в структуру.

Спасибо всем за помощь.

+0

Есть ли у вас пример использования этого пользовательского помощника в представлении? Благодарю. – Brandon

ответ

0

Сначала попробуйте добавить аннотации данных к свойствам модели просмотра, чтобы вы могли видеть сообщения проверки.

вы можете найти то, что вам нужно здесь

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx

или создавать новые пользовательские режимы, если это необходимо.

Что именно нужно проверить?

+0

точно так же, как подтвердить, если вы следовали правильному шаблону, как сделать проверку достоверности, например добавить <% Html.EnableClientVAlidation(); %> и включить необходимые javascripts? – michaelalm

+0

@mreyeros - не могли бы вы отредактировать свое сообщение и опубликовать код там, который здесь действительно не читается. В настоящее время я использую только ASP.NET MVC 2 и не знакомы с новым материалом ASP.NET MVC 3 (RAZOR/ubostrusive ajax и т. д.). если бы вы могли очистить почту, надеюсь, кто-то другой может помочь. Прости – michaelalm

2

Я тоже сталкивался с этим явно массовым недоверием относительно проверки стороны клиента с помощью dropdownlists в MVC 3, и лучшим решением, которое я могу предложить, является поместить недостающие атрибуты HMTL в себя.

В модели вашего типа создайте такую ​​собственность.

public Dictionary<string, object> CustomerVechicleAttributes 
    { 
     get 
     { 
      Dictionary<string, object> d = new Dictionary<string, object>(); 
      d.Add("data-val", "true"); 
      d.Add("data-val-required", "Please select a Vechicle."); 
      return d; 
     } 
    } 

Затем в коде, введите

@Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleMakeId 
      , new SelectList(Model.VehicleMakes, "Id", "Name") 
      , @UIDisplay.Dropdown_DefaultOption, 
      **Model.CustomerVechicleAttributes** }) 

Просто добавьте Model.CustomerVechicleAttributes, как htmlAttributes к вашему DropDownList. Это приведет к приложению необходимых атрибутов, которые отсутствуют. Разумеется, вам нужно будет добавить любые другие атрибуты, которые вам могут понадобиться, например, ваш атрибут класса.

Надеюсь, это поможет.

0

У меня была точно такая же проблема с правильной проверкой поля в TextBoxFor, но не в DropDownListFor.

@Html.DropDownListFor(m => m.PaymentTO.CreditCardType, Model.CreditCardTypeList, "Select Card Type", new { style = "width:150px;" }) 

Так как я был еще один DropDownListFor работает на той же странице, я знал, что это не общая проблема DropDownListFor. У меня также есть сложная модель, а родительский объект PaymentTO не был инициализирован. Когда я устанавливаю viewTO.PaymentTO = новый PaymentTO(); в контроллере, проверка для DropDownListFor начала работать. Таким образом, возможно, проблема с DropDownListFor, но исправление может быть таким же простым, как инициализация объекта в контроллере.

2

Это самый простой способ, который я нашел для этого, просто добавив data-val-*-* атрибутов в HtmlAttributes из DropDownListFor, внутри вида. Следующий метод работает с RemoteValidation тоже, если вам не нужны удаленные проверки, просто удалить элементы, содержащие data-val-remote-*:

 @Html.DropDownListFor(m => m.yourlistID, (IEnumerable<SelectListItem>)ViewBag.YourListID, String.Empty, 
     new Dictionary<string, object>() { { "data-val", "true" }, 
     { "data-val-remote-url", "/Validation/yourremoteval" }, 
     { "data-val-remote-type", "POST" }, { "data-val-remote-additionalfield", "youradditionalfieldtovalidate" } }) 

Я надеюсь, что это может помочь. С наилучшими пожеланиями!

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