ASP.NET MVC DropdownlistFor Object引用未设置为对象的实例?

时间:2012-04-20 13:46:18

标签: asp.net-mvc drop-down-menu

这是我的组合模式:

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>

这是什么原因?

注意:本网站有很多考试。我试了很多,但我找不到错误的原因。

感谢。

4 个答案:

答案 0 :(得分:5)

我不确定你是否发布了POST操作的完整代码,但是如果你这样做,那就错了。

将数据发布到服务器时,您不会发布SelectList的值。您只发布所选值。如果您只是将视图显示回用户,则SelectList将为null。你需要在帖子中重新填充它:

[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。

答案 1 :(得分: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();
}

但我仍然不知道这是否正确。

答案 2 :(得分:0)

检查Model.Categories在条件中是否为空。

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

答案 3 :(得分: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自行检查。