dropdownlistfor 产生错误,{"Object reference not set to an instance of an object."},当我点击提交按钮

dropdownlistfor yields error ,{"Object reference not set to an instance of an object."} , when I click submit button

我正在尝试为类别创建子类别。用户首先 select 来自下拉列表的类别,然后键入子类别名称并单击提交。即使下拉列表元素已正确填充下拉列表。当我单击提交按钮时,它会产生错误。我该如何解决这个问题? 我的看法:

@model CETAPPSUGG.Models.CategorySubCategoryModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.selectedId, new { id = "3" });


   // @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>SubCatagories</h4>

        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.SubCategory.SubCategoryName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.SubCategory.SubCategoryName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.SubCategory.SubCategoryName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
Upper cat:            <div class="col-md-10">
                          @Html.DropDownListFor(Model => Model.Categories, Model.categoryList)


            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

我的控制器:

public ActionResult Create()
    {
        var categories = db.Categories.ToList();
        CategorySubCategoryModel deneme = new CategorySubCategoryModel();
        var list = new List<SelectListItem>();
        deneme.Categories = categories;
        foreach (Categories c in categories)
        {
            list.Add(new SelectListItem() { Text = c.CategoryName, Value = c.Id.ToString() });
        }

        deneme.categoryList = list;

        return View(deneme);
    }


   // POST: SubCatagories/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
   // [ValidateAntiForgeryToken]
public ActionResult Create( CategorySubCategoryModel model)
{
    string strDDLValue = model.selectedId;
    SubCatagories newSubCategory = new SubCatagories();
    Categories cat = new Categories();
    cat = db.Categories.Find(Convert.ToInt32(strDDLValue));
    //    cat =  db.Categories.Find(Convert.ToInt32(strDDLValue));

    newSubCategory.SubCategoryName = model.SubCategory.SubCategoryName;
    newSubCategory.UpperCategory = Convert.ToInt32(strDDLValue);
    newSubCategory.Categories = cat;

    db.SubCatagories.Add(newSubCategory);
    db.SaveChanges();

    return View();
}

我的模型

namespace CETAPPSUGG.Models
{
    public class CategorySubCategoryModel
    {
        SubCatagories SubCatagories { get; set; }

        public IEnumerable<Categories> Categories { get; set; }
        public IEnumerable<SubCatagories> SubCategories { get; set; }

        public IEnumerable<SelectListItem> categoryList { get; set; }

        public SubCatagories SubCategory { get; set; }

        public string selectedId;

    }
}

它在视图中造成错误

你这里有一堆问题。

您的主要问题是您没有将模型传回 post 上的视图,因此该模型为空。因此,当您尝试从视图中的模型中取消引用项目时,会生成空引用。

首先,您正在使用 selectedId 但不要在任何地方设置它。它不会被魔法设置。您可能想要的是 @Html.DropDownListFor(model => model.selectedId, Model.categoryList) (注意第一个参数中模型中的小写 m,第二个参数中的大写 M)

其次,不要在 DropDownListFor 中的 lambda 中使用模型,请使用小写模型,因为大写模型是为实际模型实例保留的。如果你想引用模型实例,那么做类似 DropDownListFor(_ => Model.Foo, Model.Foos) 的事情。请注意,我用下划线或其他不是模型的值替换了 lambda 之前的模型。坦率地说,我很惊讶这竟然能起作用,但这里可能有一个覆盖外部模型的范围规则。避免这种情况,因为它会让你在路上感到困惑。

第三,您将 IEnumerable 作为选定项变量传递给 DropDownListFor,这在多个级别上都不起作用。在大多数情况下,这需要是一个字符串值(有时是一个数字,但总是一个更基本的类型,可以调用 ToString() 并获得一个合理的字符串,因为 DropDownListFor 无法显示复杂的对象)。

第四,您还需要在 Post 操作中重新填充您的 DropDownListFor,因为下拉列表的内容不会 post 返回,因此将为空在模型中。这与您视图中的 SubCategory 取消引用最终是生成 Null Reference 异常的原因。

您还需要将模型传回 Post 中的视图,但如上所述,它需要使用类别和子类别重新初始化。

这里可能还有更多问题,但解决这些问题后您应该就可以了。