Pregunta

He creado un editor de plantillas para representar la selección de una lista desplegable dinámica y funciona como debe a excepción de validación, que no he sido capaz de averiguar. Si el modelo tiene el conjunto de atributos [Required], me gustaría que eso invalida si se selecciona la opción por defecto.

El objeto vista de modelo que debe ser representada como la lista desplegable es Selector:

public class Selector
{
    public int SelectedId { get; set; }
    public IEnumerable<Pair<int, string>> Choices { get; private set; }
    public string DefaultValue { get; set; }

    public Selector()
    {
        //For binding the object on Post
    }

    public Selector(IEnumerable<Pair<int, string>> choices, string defaultValue)
    {
        DefaultValue = defaultValue;
        Choices = choices;
    }
}

Las miradas editor de plantillas como esta:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<select class="template-selector" id="<%= ViewData.ModelMetadata.PropertyName %>.SelectedId" name="<%= ViewData.ModelMetadata.PropertyName %>.SelectedId">
<%
    var model = ViewData.ModelMetadata.Model as QASW.Web.Mvc.Selector;
    if (model != null)
    {
            %>
    <option><%= model.DefaultValue %></option><%
        foreach (var choice in model.Choices)
        {
            %>
    <option value="<%= choice.Value1 %>"><%= choice.Value2 %></option><%
        }
    }
     %>
</select>

En cierto modo me tengo que trabajar llamando desde el punto de vista del modo siguiente (Category es un Selector):

<%= Html.ValidationMessageFor(n => n.Category.SelectedId)%>

Pero muestra el error de validación para no suministrar un número adecuado y que no le importa si fijo el atributo Required.

¿Fue útil?

Solución

He encontrado una solución en la que la validación se realiza contra los campos ocultos usando reglas de validación personalizada, aquí . Usando este enfoque se puede agregar fácilmente una validación personalizada de tipos arbitrarios.

Otros consejos

¿Por qué no es su editor de plantillas inflexible?

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<QASW.Web.Mvc.Selector>" %>

¿Por qué no usar el ayudante DropDownListFor:

<%= Html.DropDownListFor(
    x => x.SelectedId, 
    new SelectList(Model.Choices, "Value1", "Value2")
)%>

Para evitar las cuerdas mágicas se podría añadir una propiedad ChoicesList a su modelo de vista:

public IEnumerable<SelectListItem> ChoicesList 
{
    get
    {
        return Choices.Select(x => new SelectListItem
        {
            Value = x.Value1.ToString(),
            Text = x.Value2
        });
    }
}

y su ayudante se unen a ella:

<%= Html.DropDownListFor(x => x.SelectedId, Model.ChoicesList) %>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top