2012-04-20 84 views
1

這是我的組合模型:ASP.NET MVC DropdownlistFor對象引用未設置爲對象的實例?

public class AddArticleModel 
{ 
    public TBL_ARTICLES Article { get; set; } 
    public IEnumerable<TBL_CATEGORIES> Categories { get; set; } 
} 

和控制器,它使用模式。

public ActionResult AddArticle() 
{ 
    AddArticleModel AddArticleModel = new AddArticleModel(); 
    AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a); 

    return View(AddArticleModel); 
} 

,並查看:

@model DunyaYazilim.Models.AddArticleModel 
@{ 
    ViewBag.Title = "AddArticle"; 
} 
@using (Html.BeginForm((string)ViewBag.FormAction, "Home")) 
{ 
    <fieldset> 
     <legend>Add Article Form</legend> 
     <ol> 
      <li> 
       @Html.DropDownListFor(m => m.Categories, Model.Categories.Select(c => new SelectListItem { Text = c.Name, Value = c.CategoryID.ToString() }), "-----Select Category----") 
      </li> 
     </ol> 
     <input type="submit" value="Send" /> 
    </fieldset> 
} 

,並張貼方法控制器:

[HttpPost] 
public ActionResult AddArticle(AddArticleModel AddArticleModel) 
{ 
    //Insert operations: 
    return View(AddArticleModel); 
} 

我的問題:當我張貼的形式,出現錯誤:對象引用未設置爲一個實例的一個對象。在線:13

Line 12:    <li> 
Line 13:     @Html.DropDownListFor(m => m.Categories, Model.Categories.Select(c => new SelectListItem { Text = c.Name, Value = c.CategoryID.ToString() }), "-----Select Category----") 
Line 14:    </li> 
Line 15:    <li> 

這是什麼原因?

注:本網站有很多檢查。我嘗試了很多,但我找不到錯誤的原因。

謝謝。

+0

可能重複[什麼是NullReferenceException,以及如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix -it) – 2017-01-11 10:28:36

回答

5

我不知道,如果你張貼的完整代碼的POST操作,但如果你沒有那麼它是錯誤的。

當您將數據發佈到服務器時,您不會發布您的SelectList的值。您只發布選定的值。如果您只是將視圖顯示回給用戶,那麼SelectList將爲空。你需要重新填充中郵:

[HttpPost] 
public ActionResult AddArticle(AddArticleModel AddArticleModel) 
{ 
    AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a); 

    return View(AddArticleModel); 
} 

如果你只想要回選擇的類別(似乎很奇怪),這將做到這一點:

[HttpPost] 
public ActionResult AddArticle(AddArticleModel AddArticleModel) 
{ 
    AddArticleModel.Categories = entity.TBL_CATEGORIES.Where(a => a.CategoryId == AddArticleModel.CategoryId); 

    return View(AddArticleModel); 
} 

這裏假設你的視圖模型屬性是CategoryId,並且TBL_CATEGORIES實體上的屬性也是CategoryId。

+0

AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a);是返回所有類別。我只想檢索選定的值。我對mvc感到抱歉。 – 2012-04-20 14:09:02

+0

更新了帖子。 – Dismissile 2012-04-20 14:25:19

+0

AddArticleModel不包含CategotyID。發生語法錯誤。 – 2012-04-20 14:32:53

0

檢查Model.Categories在條件中不爲null。

@Html.DropDownListFor(m => m.Categories, Model.Categories != null ?    
     Model.Categories.Select 
     (
     c => new SelectListItem 
     { 
      Text = c.Name, 
      Value = c.CategoryID.ToString() 
     }) : null, "-----Select Category----") 
+0

這可以防止Null引用,但它並不能真正解決問題。如果他使用你的代碼發佈並重新顯示視圖,那麼下拉列表中將沒有任何內容,並且此時他將無法更改他的選擇。 – Dismissile 2012-04-20 13:56:51

0

問題是與這樣的:

[HttpPost] 
public ActionResult AddArticle(AddArticleModel AddArticleModel) 
{ 
    //Insert operations: 
    return View(AddArticleModel); 
} 

當一個提交表單時,只有一個下拉的所選擇的項目(多個)被張貼。例如,如果您有一個包含100個選項的下拉列表,如果您選擇一個選項,則在提交表單時,只會發送一個選項。因此,模型綁定器沒有足夠的信息來重新創建您的下拉列表。

所以你需要通過模型回視圖之前重新填充下拉列表:

[HttpPost] 
public ActionResult AddArticle(AddArticleModel AddArticleModel) 
{ 
    AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a); 

    return View(AddArticleModel); 
} 

您可以通過使用Fiddler2檢查這個自己。

1

我解決了它

我用這個:

<div>@Html.DropDownList("CategoryID", new SelectList(Model.Categories, "CategoryID", "Name"),"-----Select Category-----")</div> 

和我的控制器:

[HttpPost] 
public ActionResult AddArticle(AddArticleModel AddArticleModel,String CategoryID) 
{ 
    TBL_ARTICLES article = AddArticleModel.Article; 
    article.CategoryID = Int32.Parse(CategoryID); 
    //some code... 

    return View(); 
} 

但我依然不知道這是否是正確的方法。

相關問題