【问题标题】:ASP.NET MVC DropdownlistFor Object reference not set to an instance of an object?ASP.NET MVC DropdownlistFor 对象引用未设置为对象的实例?
【发布时间】:2017-08-20 09:58:55
【问题描述】:

这是我的组合模型:

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>

这是什么原因?

注意:这个网站有很多例子。我尝试了很多,但我找不到错误的原因。

谢谢。

【问题讨论】:

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


【解决方案1】:

我不确定您是否发布了 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。

【讨论】:

  • AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a);是返回所有类别。我只想检索选定的值。对不起,我是 mvc 新手。
  • AddArticleModel 不包含 CategotyID。出现语法错误。
  • 我在回答中说这是假设您有一个 CategoryID。由于您尚未发布模型,因此我不知道它是什么。你将不得不自己改变它。
【解决方案2】:

我解决了

我用过这个:

<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();
}

但我还是不知道这是否正确。

【讨论】:

    【解决方案3】:

    检查条件中的 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----")
    

    【讨论】:

    • 这可以防止空引用,但并不能真正解决问题。如果他使用您的代码发布并重新显示视图,下拉列表中将没有任何内容,此时他将无法更改他的选择。
    【解决方案4】:

    问题在于:

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

    提交表单时,仅发布下拉列表中选定的项目。例如,如果您有一个包含 100 个选项的下拉列表,如果您选择一个选项,则在提交表单时,只会发送该选项。因此,modelbinder 没有足够的信息来重新创建您的下拉列表。

    因此,您需要在将模型传回视图之前重新填充下拉列表:

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

    您可以使用Fiddler2 自行检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-13
      • 2014-10-15
      • 1970-01-01
      • 2013-07-26
      • 2013-10-28
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多