我正在尝试对两个类PurchaseDetail
和ItemDetail
执行CRUD操作。将PurchaseDetail
作为基类,将ItemDetail
作为子类。因此,在单个剃刀视图中,我传递子类对象。现在,当我在子类上执行CRUD操作时,一切正常。但是在尝试使用基类时,我通过在HttpPost上调用create(ItemDetail obj)来添加数据时获取null对象。
任何解决方案?通过使用继承将多个类传递给视图是一种好习惯吗?
编辑 阐述:
public class PurchaseDetail
{
public int ID { get; set; }
[Required]
[Display(Name = "PPRF Name")]
public string pprfName { get; set; }
public int DepartmentID { get; set; }
[Display(Name ="Department")]
public string DepartmentName { get; set; }
public int DepartmentSerial { get; set; }
public List<SelectListItem> MaterialTypes { get; set; }
上面的类是我的基类,只有很少的属性。然后下面是我的孩子班。
public class ItemDetail: PurchaseDetail
{
public int ItemID { get; set; }
public int ItemCategoryID { get; set; }
public string ItemCategoryName { get; set; }
public int ProductID { get; set; }
如果我在不同的页面中同时使用,则没有任何问题。但是我想将这两个类传递给同一个视图,所以我去了继承。我从同一个视图中弹出ItemDetail的表单,添加一个项目。
@model AIIMSINTRANET.Models.ItemDetail
首先,我使用Ajax调用插入ItemDetail。这里的事情很好。
public JsonResult Add(ItemDetail item)
{
//Insert Logic
}
在此之后我想在其各自的表中插入PurchaseDetail。由于视图相同,因此在调用此方法时,TextBox,Dropdowns等每个字段都被填充。
public ActionResult Create()
{
ItemDetail obj = new ItemDetail();
obj.DeptIndentNo = GetIndentNumber2();
obj.IndentDate = DateTime.Now.Date;
obj.MaterialTypes = PurchaseProposalDO.PopulateMaterialType();
//Initialized all other fields
}
甚至在上面的函数调用期间填充了像ItemDetail类的DropDown这样的字段。现在,当我将表单提交到Insert PurchaseDetail时,它会在函数下面调用:
[HttpPost]
public ActionResult Create(ItemDetail obj)
{
// Insert Logic Here
}
现在这是我的问题。为什么我将obj视为null? 即使我正在输入所有内容。
<div class="form-group">
@Html.LabelFor(model =>model.pprfName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model =>model.pprfName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.pprfName, "", new { @class = "text-danger" })
</div>
</div>
请帮忙。
答案 0 :(得分:0)
如果没有看到有问题的课程定义,很难肯定地回答,但听起来你所拥有的是订单标题/订单行类型关系。如果是这样的话,使用继承绝对是解决这个问题的错误方法。您应该使用封装其他两个对象的视图模型并传递它。类似的东西:
public class OrderViewModel
{
public PurchaseDetail PurchaseDetail { get; set; }
public ItemDetail ItemDetail { get; set; }
}
或者,如果单个ItemDetail
可能有多个PurchaseDetail
:
public class OrderViewModel
{
public PurchaseDetail PurchaseDetail { get; set; }
public IEnumerable<ItemDetail> ItemDetails { get; set; }
}
或者,您可以让视图模型仅传递视图感兴趣的属性。同样,在没有看到类的定义的情况下,很难更具体。