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 中的视图,但如上所述,它需要使用类别和子类别重新初始化。
这里可能还有更多问题,但解决这些问题后您应该就可以了。
我正在尝试为类别创建子类别。用户首先 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 中的视图,但如上所述,它需要使用类别和子类别重新初始化。
这里可能还有更多问题,但解决这些问题后您应该就可以了。