2012-04-20 143 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(); 
} 

但我依然不知道这是否是正确的方法。

相关问题