Question

J'ai créé un modèle d'éditeur pour représenter la sélection dans une liste déroulante dynamique et fonctionne comme il devrait l'exception de la validation, que je suis incapable de comprendre. Si le modèle a l'ensemble d'attributs [Required], je veux que, pour invalider si l'option par défaut est sélectionnée.

L'objet modèle de vue qui doit être représentée comme la liste déroulante est 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;
    }
}

Le modèle de l'éditeur ressemble à ceci:

<%@ 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>

Je sorte de eu à travailler en l'appelant de la vue comme celui-ci (où Category est un Selector):

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

Mais il montre l'erreur de validation pour ne pas fournir un nombre approprié et il ne se soucie pas si je mets l'attribut Required.

Était-ce utile?

La solution

J'ai trouvé une solution où la validation se fait contre les champs cachés en utilisant des règles de validation personnalisée, ici . En utilisant cette approche, vous pouvez facilement ajouter la validation personnalisée à des types arbitraires.

Autres conseils

Pourquoi pas votre modèle d'éditeur fortement typé?

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

Pourquoi ne pas utiliser l'assistant DropDownListFor:

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

Pour éviter les chaînes magiques, vous pouvez ajouter une propriété ChoicesList à votre modèle de vue:

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

et lier votre aide à lui:

<%= Html.DropDownListFor(x => x.SelectedId, Model.ChoicesList) %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top