2012-07-12 223 views
0

由於我是asp.net mvc 3的新手,我對其內部過程並不瞭解。我有兩個作用,以創建新的類別爲獲取和Post方法:此屬性不能設置爲空值

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處於調試模式時才引發異常,而wh我繼續調試,然後只驗證消息中顯示錯誤。在這裏,實際上必須是錯誤應該顯示,而不是在調試模式下拋出異常,這是正常的。我已經在數據庫以下類別表列,並使用模型第一種方法實體框架:

  • ID - >主鍵和身份,整數
  • 類別名稱 - >非空,VARCHAR(50)
  • ParentCategoryID - >可空

我不擅長asp.net mvc 3,不知道可能是什麼問題。

回答

0

在你的行動取代:

ViewBag.ParentCategoryID = items; 

有:

ViewBag.Categories = items; 

,並在您的視圖:

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

的DropDownList的幫手需要2個參數:第一個表示標屬性將保存選定的值,第二個參數爲可用項目的集合。他們應該是不同的。

+0

我已經完成了你所說的但顯示了'編譯器錯誤消息:CS1660:不能將lambda表達式轉換爲鍵入'string',因爲它不是委託類型'。這裏,ParentCategoryID是整數類型。有沒有其他的方法 – CodeManiac 2012-07-12 06:18:35

+0

在哪條線上拋出這個錯誤? – 2012-07-12 06:23:35

+0

感謝您的回答。最後我有解決方案。問題在於CategoryName字符串由於預綁定驗證而轉換爲空,因此我添加了DisplayFormat屬性(ConvertEmptyStringToNull = false)。現在,我不會拋出異常,並顯示客戶端驗證消息 – CodeManiac 2012-07-12 06:41:03

0

幸運的是我找到了解決方案。實際上,問題是由於PreBinding驗證。我正在尋找並找到相同的問題在這個link很好地解釋。

我已經做局部類如下類別:

public partial class Category{ 
    } 

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

這裏,轉換空字符串爲null被設置爲DisplayFormat屬性已經解決了我的問題,假的。

相關問題