2010-10-19 28 views
1

J'ai cet objet créé à partir de EntityFramework à partir de ma base de données.Comment éviter une erreur ModelBinder dans les champs obligatoires d'une liste?

[EdmEntityTypeAttribute(NamespaceName="ContactCoreModel", Name="TargetLang")] 
[Serializable()] 
[DataContractAttribute(IsReference=true)] 
public partial class TargetLang : EntityObject 
{ 
    #region Factory Method 

    /// <summary> 
    /// Create a new TargetLang object. 
    /// </summary> 
    /// <param name="idTarget">Initial value of the idTarget property.</param> 
    /// <param name="idLang">Initial value of the idLang property.</param> 
    /// <param name="name">Initial value of the name property.</param> 
    public static TargetLang CreateLinguaTarget(global::System.Int32 idTarget, global::System.Int32 idLang, global::System.String name) 
    { 
     TargetLang targetLang = new TargetLang(); 
     targetLang.idTarget = idTarget; 
     targetLang.idLang = idLang; 
     targetLang.name = name; 
     return targetLang; 
    } 

    #endregion 

    [...] 

    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
    [DataMemberAttribute()] 
    public global::System.String name 
    { 
     get 
     { 
      return _nome; 
     } 
     set 
     { 
      OnnomeChanging(value); 
      ReportPropertyChanging("name"); 
      _nome = StructuralObject.SetValidValue(value, false); 
      ReportPropertyChanged("name"); 
      OnnomeChanged(); 
     } 
    } 
} 

Dans mon Créer une vue que je vais faire quelque chose comme

<% using (Html.BeginForm()) { %> 
    <% foreach (var lang in Env.ActiveLangs) { %> 
    <fieldset> 
     <legend>Data for language <%: lang.name %></legend> 
     <% var targetLang = Model.targetsLangs.FirstOrDefault(lt => lt.idLang.Equals(lang.id)) ?? new TargetLang(); %> 
     <div class="editor-label"> 
     <%: Html.Hidden("targetLangs.Index", lang.id)%> 
     <%: Html.Hidden("targetLangs[" + lang.id + "].idLingua", lang.id)%> 
     <%: Html.Hidden("targetLangs[" + lang.id + "].idTarget", Model.id)%> 
     <%= Html.Label("targetLangs_" + lang.id + "__name", "name")%> 
     </div> 
     <div class="editor-field"> 
     <%: Html.TextBox("targetLangs[" + lang.id + "].name", targetLang.name)%> 
     <%: Html.ValidationMessage("targetLangs[" + lang.id + "].name")%> 
     </div> 
    </fieldset> 
    <% } %> 
    <p> 
    <input type="submit" value="Create" /> 
    </p> 
<% } %> 

Et dans mes contrôleurs

[HttpPost] 
public ActionResult Create(IList<TargetLang> targetLangs) 
{ 
    if (ModelState.IsValid) 
    { 
    _repTargetsLangs.Add(targetLangs); 
    _repTargetsLangs.Save(); 

    return RedirectToAction("Index"); 
    } 

    return View(target); 
} 

Le problème est que ModelState est toujours valide, parce que vous pouvez soumettre seulement nom pour toutes les langues - vous n'avez pas à traduire la cible dans toutes les langues -, mais le nom est obligatoire pour db, donc le modèle Binder génère une erreur.

Ma question est: où je dois opérer, pour corriger cette erreur?
Au niveau du classeur Modèle?
Dans le contrôleur avant l'appel ModelState.IsValis? Et comment?

Je suis sûr que ce cas est arrivé à beaucoup, mais je ne peux pas trouver une solution élégante et évolutive.
Merci.

Répondre

0

Marque nom un champ caché que le liant modèle trouverez:

<%: Html.Hidden("targetLangs[" + lang.id + "].idTarget", Model.id)%> 
    <%= Html.Label("targetLangs_" + lang.id + "__name", "name")%> 
    <%= Html.Hidden("targetLangs_" + lang.id + "__name", "name")%> 
+0

Le trouver Binder modèle le nom avec ma syntaxe. –