Ненавязчивая проверка выпадающего списка в MVC 3 - PullRequest
1 голос
/ 25 мая 2011

Таким образом, ссылка ниже обрисовывает проблему с MVC 3 / ненавязчивая проверка с выпадающими списками. По существу, сценарий проверки на стороне клиента не создается для раскрывающихся списков. Есть ли прямой обходной путь для этого? Я запутался в том, как MVC 3 был выпущен таким образом, когда об этой ошибке сообщили задолго до финальной версии. Есть ли простое решение для этого, которое появилось, пока мы ждем исправления?

Может быть, я один на этом, но, кажется, проверка ВСЕХ элементов формы важна. :)

DropDownListFor () Проблема ненавязчивой проверки

Ответы [ 4 ]

4 голосов
/ 16 августа 2011

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

Оказывается, что если вы попытаетесь поместить список выбора в ViewData или ViewBag, используя то же имя, что и устанавливаемое свойство, проверка на стороне клиента не будет работать.Тем не менее, раскрывающийся список будет заполнен, поэтому он крайне неинтуитивен.

// Do NOT do this:
// In the controller:
ViewBag.ItemID = Database.Items.Select(i => new SelectListItem(){Value = i.ID, Text = i.Name});
// In the view:
@Html.DropDownList("ItemID")

// Instead DO this
// In the controller:
ViewBag.ItemIDList = Database.Items.Select(i => new SelectListItem(){Value = i.ID, Text = i.Name});
// In the view:    
@Html.DropDownListFor(m => m.ItemID, (IEnumerable<SelectListItem>)ViewBag.ItemIDList)

Несмотря на то, что первый дает идеально функциональный раскрывающийся список, он почему-то просто не проходит проверку на стороне клиента.Если вы проверите HTML, все атрибуты элемента «select» просто отсутствуют.

Это полностью противоположно тому, как каждое другое поле или редактор заполняется в MVC, поскольку вы можете установить значения по умолчанию и текущие значения, установив ViewBag.ItemName = "Bob", и если у вас есть текстовое поле "ItemName", оно будетзаполнить с "Боб".

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

2 голосов
/ 12 июня 2013

Вы можете прикрепить обязательные атрибуты data- * к элементу, чтобы они выбирались ненавязчивым скриптом проверки.

@Html.DropDownListFor(x => x.People, new SelectList(Model.People,"Id", "Name"), "Select Person", new Dictionary<string, object>() {{ "data-val", "true" }, { "data-val-required", "Please select a person" }} )
1 голос
/ 25 мая 2011

У меня тоже вроде нормально работает

   <p>                                                         
       <p>
            <span class="lbl"> @Html.LabelFor(x => x.SelectedTimeZone, " Select a TimeZone: ")</span>
            <span>@Html.DropDownListFor(x => x.SelectedTimeZone, Model.TimeZones)</span>
            <span class="validation-error">@Html.ValidationMessageFor(x => x.SelectedTimeZone)</span>    
        </p>

// просмотр модели

  [Required(ErrorMessage = "Time zone is required")]
    public string SelectedTimeZone { get; set; }
    public SelectList TimeZones { get; set; }

    public SetupViewModel()
    {
        TimeZones = new SelectList(TimeZoneExtensions.BuildTimeZoneList(), "value", "text", "selected");
        SelectedTimeZone = "UTC";
    }
0 голосов
/ 25 мая 2011

Ах, это странно, потому что следующее прекрасно работает для меня.

Посмотреть модель:

public class MyViewModel
{
    [Required]
    public string SelectedItem { get; set; }

    public IEnumerable<SelectListItem> Items
    {
        get
        {
            return Enumerable.Range(1, 5).Select(x => new SelectListItem
            {
                Value = x.ToString(),
                Text = "item " + x
            });
        }
    }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

Вид:

@using AppName.Models
@model MyViewModel

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>

@using (Html.BeginForm())
{
    @Html.DropDownListFor(
        x => x.SelectedItem,
        new SelectList(Model.Items, "Value", "Text"),
        "-- please select an item --"
    )
    @Html.ValidationMessageFor(x => x.SelectedItem)
    <input type="submit" value="OK" />
}

Оставьте раскрывающийся список без выбора значения, и проверка на стороне клиента будет запущена немедленно.

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