0

私は MVC 初心者で、ModelState.modelerror を追加して、ドロップダウン リストを検証し、カスタム エラー メッセージを表示しようとしています。内部的には、画面に表示されるドロップダウン リストであるフィールド「Board」は「ProviderId」と呼ばれます。UI で、ドロップダウンから値を選択しないときに「ボードを空にすることはできません」というメッセージを表示したいのですが、「ProviderId フィールドが必要です」としか表示されません。この方法は、他の編集フィールドでも機能するようです。

これは私のコントローラーコードです

  [HttpPost]
        public ActionResult Create(CourseList courselist)
        {
           //This works! It shows Class Name cannot be Empty next to class field on submit
            if (courselist.CourseName == null)
            {
                ModelState.AddModelError("CourseName", " Class Name cannot be Empty");
                ViewBag.ProviderID = new SelectList(db.ProviderLists, "ProviderID", "ProviderName", courselist.ProviderID);
                return View(courselist);
            }
//This does not work! It shows the internal binding message instead of this custom message
            if (courselist.ProviderID == null)
            {
                ModelState.AddModelError("ProviderID", " Board cannot be Empty");
                ViewBag.ProviderID = new SelectList(db.ProviderLists, "ProviderID", "ProviderName", courselist.ProviderID);
                return View(courselist);
            }

            if (ModelState.IsValid)
            {
                db.CourseLists.Add(courselist);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.ProviderID = new SelectList(db.ProviderLists, "ProviderID", "ProviderName", courselist.ProviderID);
            return View(courselist);
        }

これは私の関連するViewコードです

 <div class="editor-field">
            @Html.DropDownList("ProviderID", String.Empty)
            @Html.ValidationMessageFor(model => model.ProviderID)
        </div>

他の 2 つの編集フィールドでは正常に機能します。つまり、送信時にフィールドの横にカスタム メッセージが出力されますが、ドロップダウン リストには常に「providerId フィールドが必要です」という内部バインディング メッセージが表示されます。メッセージをカスタム追加メッセージに変更するにはどうすればよいですか。これは、コード内のすべてのドロップダウン リストで発生します。ProviderId は DB の必須フィールドであり、メッセージが表示されますが、それをオーバーライドしてカスタム メッセージを表示するにはどうすればよいですか? これは簡単な修正かもしれませんが、私は MVC の初心者 (2 時間) であり、これを修正したいと考えています。

「ボードを空にすることはできません」

EDITED : フィールドは ProviderID です

4

1 に答える 1

0

edmx データベース優先 (またはモデル優先) アプローチを使用しているため、ファイルと対応するファイルがあると思い.Designer.csます。この最後のファイルには、おそらく次のようなものがあります。

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Int32 ProviderID

ここでは、型intは null 許容ではなく、プロパティには metadata 属性がありますIsNullable=false。そのため、ASP.NET MVC は既定のエラー メッセージを表示します。

簡単な回避策は、データベースのフィールドを不要に設定してから、モデルを更新することです。その後、次の.Designer.csようなものが表示されるはずです。

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public Nullable<global::System.Int32> ProviderID

これで、「ボードを空にすることはできません」というカスタム メッセージが表示されます。

(データベースとモデルを変更する代わりに)より良いアプローチは、コントローラーから削除してif (courselist.ProviderID == null)...メタデータを使用することです。ここにスニペットがあります:

[MetadataType(typeof(YourEntityMetaData))]
public partial class YourEntity
{

}

public class YourEntityMetaData
{   
   [Required(ErrorMessage = "Board cannot be empty")]
   public int ProviderID   { get; set; }    
}
于 2013-07-24T14:54:22.240 に答える