0

私はasp.net mvc 3の初心者なので、内部プロセスについて十分な知識がありません。Get および Post メソッドとして新しいカテゴリを作成する 2 つのアクションがあります。

   public ActionResult Create()
        {
            List<Category> cat = this.display_children(null, 0);
            List<SelectListItem> items = new SelectList(cat, "ID", "CategoryName").ToList();
            items.Insert(0, (new SelectListItem { Text = "root", Value = "" }));
            ViewBag.ParentCategoryID = items;
            return View();
        } 

        [HttpPost]
        public ActionResult Create(Category category)
        {
            if (ModelState.IsValid)
            {
                db.Categories.AddObject(category);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            List<Category> cat = this.display_children(null, 0);
            List<SelectListItem> items = new SelectList(cat, "ID", "CategoryName").ToList();
            items.Insert(0, (new SelectListItem { Text = "root", Value = "" }));
            ViewBag.ParentCategoryID = items;
            return View(category);
        }

以下はビューです:

@model IVRControlPanel.Models.Category

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Category</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.CategoryName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CategoryName)
            @Html.ValidationMessageFor(model => model.CategoryName)
        </div>

       <div class="editor-label">
           @Html.Label("Select Category")
        </div>
      <div>
          @*@Html.DropDownList("CategoryList",new SelectList(ViewBag.Categories))*@
          @Html.DropDownList("ParentCategoryID", ViewBag.ParentCategoryID as SelectList) 
          @Html.ValidationMessageFor(model => model.ParentCategoryID)

        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

問題: カテゴリ名フィールドに入力せずに作成ボタンをクリックすると、次の例外がスローされます。

This property cannot be set to a null value.

Visual Studio がデバッグ モードの場合にのみ例外がスローされ、デバッグを続行すると、検証メッセージにエラーのみが表示されます。ここで、実際に必要なのは、デバッグモードではない間は問題ない例外をスローせずにエラーを表示することです。データベースに次のカテゴリ テーブル列があり、モデル ファースト アプローチ エンティティ フレームワークを使用します。

  • ID -> 主キーとアイデンティティ、整数
  • CategoryName -> null 非許容、varchar(50)
  • ParentCategoryID -> Nullable

私はasp.net mvc 3が苦手で、何が問題なのかわかりません。

4

2 に答える 2

0

あなたの行動で置き換えます:

ViewBag.ParentCategoryID = items;

と:

ViewBag.Categories = items;

そしてあなたの見解では:

@Html.DropDownListFor(x => x.ParentCategoryID, ViewBag.Categories as SelectList) 

DropDownListヘルパーには2つの引数が必要です。最初の引数は選択された値を保持するスカラープロパティを表し、2番目の引数は使用可能なアイテムを含むコレクションを表します。それらは異なるはずです。

于 2012-07-12T06:06:22.197 に答える
0

幸いなことに、私はこれに対する解決策を見つけました。実際、問題はPreBindingの検証が原因でした。私は検索していて、このリンクで同じ問題がうまく説明されているのを見つけました。

私は以下のようにカテゴリーの部分クラスを作成しました:

  public partial class Category{
    }

    public class TestEntityValidation{
        [Required]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public String CategoryName { get; set; }
    }

ここでは、空の文字列をnullに変換することはfalseに設定されており、DisplayFormat属性での私の問題を解決しています。

于 2012-07-12T06:37:38.353 に答える