2010-10-19 22 views
1

我从我的数据库中创建了EntityFramework创建的这个对象。如何防止列表的必填字段中出现ModelBinder错误?

[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(); 
     } 
    } 
} 

在我创建视图,我会做这样的事情

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

在我的控制器

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

    return RedirectToAction("Index"); 
    } 

    return View(target); 
} 

的问题是,ModelState中始终是无效的,因为你可以只提交所有语言的名称 - 您不必翻译所有语言的目标 - ,但名称对数据库是必需的,因此模型Binder会产生错误。

我的问题是:我在哪里操作,纠正这个错误?
在Model binder级别?
在ModelState.IsValis调用之前的Controller中? 又如何?

我确定这种情况已经发生了很多,但我找不到一个优雅的,可扩展的解决方案。
谢谢。

回答

0

制作名称的隐藏字段,该模型粘结剂会发现:

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

模型绑定找到我的语法名称。 – 2010-10-19 16:23:02