通过mvc,asp.net中的控制器将多个类对象传递给剃刀视图

时间:2017-11-08 23:52:14

标签: c# asp.net-mvc inheritance

我正在尝试对两个类PurchaseDetailItemDetail执行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>

请帮忙。

1 个答案:

答案 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; }
}

或者,您可以让视图模型仅传递视图感兴趣的属性。同样,在没有看到类的定义的情况下,很难更具体。