私はMVCを初めて使用しますが、かなり基本的なMVCのものであると私が考えるものにまだ少し苦労しています。私の意図する目的は、DataAnnoationsを使用して簡単に検証できるように、データオブジェクトのコレクションを表すテキストボックスをレンダリングすることです。私はこのチュートリアルを読んで理解し、問題なく動作するようになりました。ただし、プリミティブで構成される1人のオブジェクトを一度に1つずつ検証するだけです。
http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx
私の問題はこの投稿に似ていますが、Razorがない状況にそれを適用することに失敗しました:
データアノテーションを使用したコレクションでのMVC3クライアント側の検証-機能しない
検証は、Stringやintなどの「プリミティブ」でうまく機能しますが、コレクションでの検証を理解していません。
これが私のオブジェクトの1つのインスタンスといくつかの検証を表すクラスです:
public class vc_EBTOCRecord
{
[StringLength(10, ErrorMessage = "must be under 10 chars")]
[Required(ErrorMessage = "Problem!")]
public String ItemText;
}
ビューが継承するモデルは次のとおりです。
public class EBTOCViewModel
{
public List<vc_EBTOCRecord> VcEbtocRecordList { get; set; }
}
これが私のコントローラーです:
public ActionResult Create()
{
EBTOCViewModel ebtocViewModel = new EBTOCViewModel();
List<vc_EBTOCRecord> vcEbtocRecordList = new List<vc_EBTOCRecord>();
vc_EBTOCRecord vcEbtocRecord = new vc_EBTOCRecord();
vcEbtocRecord.ItemText = "bob";
vcEbtocRecordList.Add(vcEbtocRecord);
vc_EBTOCRecord vcEbtocRecord2 = new vc_EBTOCRecord();
vcEbtocRecord.ItemText = "fred";
vcEbtocRecordList.Add(vcEbtocRecord2);
vc_EBTOCRecord vcEbtocRecord3 = new vc_EBTOCRecord();
vcEbtocRecord.ItemText = "joe";
vcEbtocRecordList.Add(vcEbtocRecord3);
ebtocViewModel.VcEbtocRecordList = vcEbtocRecordList;
return View(ebtocViewModel);
}
そして最後に、これが私の見解で私が試みていることです:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<vcAdminTool.ViewModels.EBTOCViewModel>" %>
<h2>Create</h2>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<% foreach(var thing in Model.VcEbtocRecordList)
{
Html.TextBoxFor(model => thing.ItemText);
//Html.TextBox("hello", thing.ItemText ); didn't work...
//Html.TextBox("hello"); nope, still didn't work
Response.Write("a record is here");
}
%>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
ビューがレンダリングされると、「レコードはここにあります」が3回印刷され、MVCが作成した基になるオブジェクトを認識することを示しますが、なぜ3つのテキストボックスをレンダリングしないのでしょうか。
望ましい結果は、3つの空白の検証済みテキストボックスを持つことです。次に、フォームが有効な場合に情報をデータベースに書き戻すコードを記述します。
よろしければ、私が見逃している明らかなことは何ですか?