![](/img/trans.png)
[英]How to whitelist/blacklist child object fields in the ModelBinder/UpdateModel method?
[英]How to prevent a ModelBinder error in a mandatory fields of a list?
我已經從數據庫的EntityFramework創建了這個對象。
[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始終是無效的,因為您只能為所有語言提交一個名稱-尚未以所有語言翻譯目標-但該名稱對於db是必需的,因此Model Binder會引發錯誤。
我的問題是: 我必須在哪里進行操作以糾正此錯誤?
在模型活頁夾級別?
在Controller之前調用ModelState.IsValis? 如何?
我敢肯定這種情況發生在很多人身上,但是我找不到一個優雅的,可擴展的解決方案。
謝謝。
將名稱設為模型綁定程序可以找到的隱藏字段:
<%: Html.Hidden("targetLangs[" + lang.id + "].idTarget", Model.id)%>
<%= Html.Label("targetLangs_" + lang.id + "__name", "name")%>
<%= Html.Hidden("targetLangs_" + lang.id + "__name", "name")%>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.