ASP.net MVC3 DropDownListFor int Обязательные данныеАннотация - PullRequest
0 голосов
/ 18 декабря 2011

Есть ли способ вызвать проверку на стороне клиента для списка выбора, созданного DropDownListFor? Список выбора, который создается помощником, похоже, не получает атрибуты «data-val» или «data-val-required», которые текстовые вводы получают для проверки на стороне клиента.

Проверка выполняется на стороне сервера, когда я проверяю ModelState.IsValid, и затем на следующей странице загружается сообщение проверки.

Я установил параметр по умолчанию «Пожалуйста, выберите ...» в списке, потому что я хочу, чтобы пользователь должен был выбрать параметр (вместо того, чтобы он выбирал первый элемент в списке).

My View Модель:

public partial class ProvinceVM
{
    [Required]
    [Range(1, int.MaxValue)]
    public int CountryId { get; set; }
    [Required]
    [StringLength(16)]
    public string Abbreviation { get; set; }
    [Required]
    [StringLength(64)]
    public string Name { get; set; }
}

Код в представлении:

<div class="editor-label">
    @Html.LabelFor(model => model.CountryId, "Country")
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.CountryId, (IEnumerable<SelectListItem>)ViewBag.CountryId, "Please Select...") 
    @Html.ValidationMessageFor(model => model.CountryId)
</div>

И код моего контроллера:

[HttpPost]
public ActionResult Create(ProvinceEditVM provinceVM)
{
    if (ModelState.IsValid)
    {
        var province = new Province() { CountryId = provinceVM.CountryId.Value, Abbreviation = provinceVM.Abbreviation, Name = provinceVM.Name };
        _repo.Add<Province>(province);
        _repo.SaveChanges();
        return RedirectToAction("index");  
    }
    ViewBag.CountryId = new SelectList(_repo.GetQuery<Country>().OrderBy(x => x.Name), "CountryId", "Name", provinceVM.CountryId);
    return View(provinceVM);
}

Вещи, которые я уже пробовал:

  • Превращение свойства CountryId модели Country в обнуляемое int (int?)
  • Удаление атрибута Range для свойства CountryId
  • Переименование ViewBag.CountryId во что-то другое (в случае возникновения конфликта с именем свойства модели представления)

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

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

На самом деле смог заставить его работать, выполнив комбинацию из всех трех вещей, которые я упомянул в конце своего поста.Сделал свойство в модели представления обнуляемым, обязательным и пришлось переименовать ViewBage.CountryId во что-то другое (я переименовал его в CountryList).

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

1 голос
/ 18 декабря 2011

Это ошибка в ненавязчивой проверке выпадающих списков. MVC 3 RTM не создает ненавязчивую проверку для коллекции раскрывающихся списков. См. http://aspnet.codeplex.com/workitem/7629.. Проблема в том, что код для создания ненавязчивой проверки делает вызов БЕЗ ссылки на метаданные, что приводит к тому, что он возвращает нулевое значение. Решением является создание собственного HtmlHelper для DropDownListFor.

Посмотрите на вложенный zip-файл для обхода проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...