Come faccio a convalidare il risultato in un editor di modelli ASP.NET MVC?
-
23-09-2019 - |
Domanda
Ho creato un editor di modelli per rappresentare la selezione da un elenco a discesa dinamico e funziona come dovrebbe tranne che per la convalida, che sono stato in grado di capire. Se il modello ha il set di attributi [Required]
, voglio che invalidare se è selezionata l'opzione predefinita.
L'oggetto vista del modello che deve essere rappresentato come l'elenco a discesa è 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;
}
}
L'editor di modelli si presenta così:
<%@ 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>
I sorta di preso a lavorare chiamando dalla visualizzazione come questo (dove Category
è un Selector
):
<%= Html.ValidationMessageFor(n => n.Category.SelectedId)%>
Ma mostra l'errore di convalida per non fornendo un numero adeguato e non importa se ho impostato l'attributo Required
.
Soluzione
Ho trovato una soluzione in cui convalida è fatto contro i campi nascosti utilizzando le regole di validazione, qui . Con questo approccio è possibile aggiungere facilmente convalida personalizzato per i tipi arbitrari.
Altri suggerimenti
Perché non è il vostro editor di modelli fortemente tipizzato?
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<QASW.Web.Mvc.Selector>" %>
Perché non usare l'helper DropDownListFor:
<%= Html.DropDownListFor(
x => x.SelectedId,
new SelectList(Model.Choices, "Value1", "Value2")
)%>
Per evitare le corde magiche si potrebbe aggiungere una proprietà ChoicesList al vostro modello di vista:
public IEnumerable<SelectListItem> ChoicesList
{
get
{
return Choices.Select(x => new SelectListItem
{
Value = x.Value1.ToString(),
Text = x.Value2
});
}
}
e vincolare il proprio aiuto ad esso:
<%= Html.DropDownListFor(x => x.SelectedId, Model.ChoicesList) %>