Esta Pregunta es similar, pero la aceptó responder resuelve el lado del servidor, estoy interesado en el lado del cliente soluciones.

Dado este ViewModel

public class MyViewModel
{
    public string ID { get; set; }

    [Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")]
    [Display(Name = "Some Choice")]
    public int SomeChoice{ get; set; }   
    [Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")]
    [Display(Name = "Keyword")]
    public string Keyword { get; set; }    
}

y la maquinilla de afeitar

<div>
@Html.LabelFor(model => model.SomeChoice, new { @class = "label" })
@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...")
@Html.ValidationMessageFor(model => model.SomeChoice)
</div>

y asumir ViewBag.SomeChoice contiene una lista de selección de opciones

El renderizado de html no obtener los datos-val=»true» data-val-required=»exijo QUE HACER UNA ELECCIÓN!» atributos como @Html.EditorFor(modelo => el modelo.Palabras clave) o @Html.TextBoxFor haría.

¿Por QUÉ?

La adición de un class = «requerido», como así

@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...", new { @class = "required" })

que utiliza jQuery Validación de la clase semántica y bloques en enviar pero no muestra el mensaje. Puedo hacer este tipo de cosas

@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...", new Dictionary<string, object> { { "data-val", "true" }, { "data-val-required", "I DEMAND YOU MAKE A CHOICE!" } })

Que pondrá el derecho de los atributos de allí, y los bloques en enviar y se muestra el mensaje, pero no tomar ventaja de la RequiredAttribute ErrorMessage tengo en mi ViewModel

Así que alguien ha escrito un DropDownListFor que se comporta como los otros HtmlHelpers con respecto a la Validación?

EDITAR
Aquí está mi código EXACTO

En HomeController.cs

  public class MyViewModel
  {
    [Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")]
    [Display(Name = "Some Choice")]
    public int? SomeChoice { get; set; }
  }


    public ActionResult About()
    {
        var items = new[] { new SelectListItem { Text = "A", Value = "1" }, new SelectListItem { Text = "B", Value = "2" }, new SelectListItem { Text = "C", Value = "3" }, };
        ViewBag.SomeChoice = new SelectList(items,"Value", "Text");
        ViewData.Model = new MyViewModel {};
        return View();
    }

Acerca de.cshtml

@using Arc.Portal.Web.Host.Controllers
@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())
{
<div>
    @Html.LabelFor(model => model.SomeChoice)
    @Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...")
    @Html.ValidationMessageFor(model => model.SomeChoice)
</div>

<button type="submit">OK</button>
}

Y aquí está el renderizado de código

<form action="/Home/About" method="post">    <div>
    <label for="SomeChoice">Some Choice</label>
    <select id="SomeChoice" name="SomeChoice"><option value="">Select...</option>
<option value="1">A</option>
<option value="2">B</option>
<option value="3">C</option>
</select>
    <span class="field-validation-valid" data-valmsg-for="SomeChoice" data-valmsg-replace="true">    </span>
</div>
<button type="submit">OK</button>
</form>

De enviarla de vuelta a mi controlador…esto no debería suceder

InformationsquelleAutor Peter | 2011-10-19

3 Comentarios

  1. 5

    Simplemente uso una que acepta valores null entero en la propiedad que son la unión de la dropdownlist en el modelo de vista:

    [Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")]
    [Display(Name = "Some Choice")]
    public int? SomeChoice { get; set; }  

    También con el fin de conseguir un correcto discreta HTML5 de datos* los atributos de la lista desplegable debe estar dentro de un formulario:

    @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())
    {
        <div>
            @Html.LabelFor(model => model.SomeChoice, new { @class = "label" })
            @Html.DropDownListFor(
                model => model.SomeChoice, 
                Model.ListOfChoices, 
                "Select..."
            )
            @Html.ValidationMessageFor(model => model.SomeChoice)
        </div>
    
        <button type="submit">OK</button>
    }

    También te darás cuenta de que me deshice de ViewBag (que yo simplemente no puede estar de pie) y lo reemplazó con la propiedad correspondiente en el modelo de vista que contendrá las opciones posibles para el menú desplegable.

    • Hice el int que aceptan valores null y todavía no escribir los datos de validación de los elementos en el control de
  2. 3

    Yo tenía el mismo problema. Y he notado que esto sucede cuando dropDownList se rellena a partir de ViewBag o ViewData. Si usted escribe
    @Html.DropDownListFor(modelo => el modelo.SomeChoice, Modelo.SomeChoice, «Seleccione…») como en el ejemplo anterior atributos de validación sería escribió.

    • Que es decepcionante en el extremo. Me extracto de toda mi lista de selección de la modelo en ViewData por lo que la lista es accesible por un nombre de la lista en un UIHInt basado en un atributo.
    • Decepcionante la información, pero es muy útil para saber. Lamentablemente el mundo real rara vez se llega a siempre ser inflexible.
  3. 0

    Los que están aquí buscando el mismo comportamiento en el Kendo, dropdownlist, por favor, agregue ‘necesaria’ en el código.

    @(Html.Kendo().DropDownListFor(m => m)
        .Name("FeatureId").BindTo((System.Collections.IEnumerable)ViewData[CompanyViewDataKey.Features])
        .DataValueField("Id")
        .DataTextField("Name")
        .OptionLabel("--Select--")
        .HtmlAttributes(new { title="Select Feature", required="required"})

    )

    Atributo[requerido] en el viewmodel no me funciona pero la adición de la anterior en Htmlattributes hizo. Espero que esto ayude a alguien.

Dejar respuesta

Please enter your comment!
Please enter your name here