我遇到创建对象的问题。我的实体有一个“等级”的一对多关系。分工可以属于另一个分部。 这是我的实体:
//Properties
[Key]
[Column(Order = 0)]
public int DivisionId { get; set; }
[Required]
[MaxLength(30)]
[Column("DivisionName", Order = 2)]
public string Name { get; set; }
//Navigation properties
public virtual Division ParentDivision { get; set; }
以下是我创建新部门的方法:
public ActionResult Create()
{
ViewBag.ParentDivision = new SelectList(db.Divisions, "DivisionId", "Name");
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Division division)
{
if (ModelState.IsValid)
{
db.Divisions.Add(division);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ParentDivision = new SelectList(db.Divisions, "DivisionId", "Name", division.ParentDivision.DivisionId);
return View(division);
}
在这种情况下,当我尝试创建属于另一个分区的分区时,我得到一个“对象引用未设置为对象的实例”。错误。
我也试过像这样改变ViewBag:
ViewBag.ParentDivision = new SelectList(db.Divisions, "ParentDivision.DivisionId", "Name", division.ParentDivision.DivisionId);
这里创建了对象,但没有父分区...
我真的很困惑......如果有人有任何想法......提前谢谢你。
答案 0 :(得分:0)
这与自我引用关系无关。如果尚未设置jQuery('button').on('added_to_cart',function() {
jQuery.post("?wc-ajax=add_to_cart",
{
product_id: jQuery(this).attr('data-product_id'),
quantity: jQuery(this).attr('data-quantity'),
},
function(data,status){
});
});
,则它将为null,并且null不具有ParentDivision
属性,因此是您的例外。
在引用属性之前,您需要进行空检查。在这种情况下,最简单的方法可能是使用三元组:
DivisionId
但是,无论如何,您都不需要设置所选值。 Razer会自动处理这个问题。您也不需要创建实际的division.ParentDivision != null ? division.ParentDivision.DivisionId : null
。所有SelectList
需求都是Html.DropDownListFor
。如果您通过它,帮助者将负责创建IEnumerable<SelectListItem>
并设置适当的选定值(如果适用)。
SelectList
然后:
ViewBag.ParentDivision = db.Divisions.Select(m => new SelectListItem { Value = m.DivisionId, Text = m.Name });
这引出了另一件事。您目前没有实际绑定的属性。您不能直接使用@Html.DropDownListFor(m => m.ParentDivisionId, (IEnumerable<SelectListItem>)ViewBag.ParentDivision)
,因为选择列表只会回发ID,而不是完整的ParentDivision
实例。您需要一个属性来绑定发布的ID,这是一个很好的做法,无论如何都要包含在您的实体中:
ParentDivision