2017-11-08 10 views
-2

私は2つのクラスPurchaseDetailItemDetailでCRUD操作を実行しようとしています。子クラスとしてPurchaseDetailを基本クラス、ItemDetailとしました。だから、私は子クラスのオブジェクトを渡している単一のかみそりのビューで。私が子クラスでCRUD操作を実行しているとき、すべて正常に動作します。しかし、基本クラスで同じことをしようとすると、HttpPostでcreate(ItemDetail obj)を呼び出してデータを追加している間にnullオブジェクトが取得されます。複数のクラスオブジェクトをmvc、asp.netのコントローラーを通してカミソリビューに渡す

これにはどのような解決策がありますか?継承を使用して複数のクラスをビューに渡すのは良い方法ですか?

編集 推敲:クラス以上

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のようなすべてのフィールドで同じなので、このメソッドを呼び出すときにドロップダウンが塗りつぶされました。 ItemDetailクラスのドロップダウンのような

public ActionResult Create() 
    { 
     ItemDetail obj = new ItemDetail(); 

     obj.DeptIndentNo = GetIndentNumber2(); 
     obj.IndentDate = DateTime.Now.Date; 
     obj.MaterialTypes = PurchaseProposalDO.PopulateMaterialType(); 
     //Initialized all other fields 
    } 

偶数フィールドは、上記の関数の呼び出し中に取り込まれてしまいました。これで、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

サンプルコードは、階層を理解し、ヌルオブジェクトを取得している場所を特定するのに役立ちます。私は問題はモデルバインディングだと思っていますが、ソリューションはカスタムモデルバインドを使用することになります。 Microsoft doc:https://docs.microsoft。com/ja-jp/aspnet/core/mvc/advanced/custom-model-binding – theoretical

答えて

0

問題のクラス定義を見ることなく、明確に答えにくいですが、あなたが持っているものはOrder Header/Order Lineタイプの関係のように聞こえます。その場合、継承を使用することは、これを解決するための絶対に間違ったアプローチです。他の2つのオブジェクトをカプセル化して渡すビューモデルを使用する必要があります。ような何か:

public class OrderViewModel 
{ 
    public PurchaseDetail PurchaseDetail { get; set; } 
    public ItemDetail ItemDetail { get; set; } 
} 

あるいは、単一PurchaseDetailのために多くのItemDetailのがあるかもしれない場合:別の方法として

public class OrderViewModel 
{ 
    public PurchaseDetail PurchaseDetail { get; set; } 
    public IEnumerable<ItemDetail> ItemDetails { get; set; } 
} 

、あなたはビューモデルをビューへの関心のプロパティのみを渡す可能性があります。繰り返しますが、クラスの定義を見ることなく、より具体的にするのは難しいです。

+0

ご連絡いただければありがとうございます。私は自分のコードを追加しました。見てください。 – chandrabhan

+0

私は、継承を使うべきではなく、ビューモデルを使うべきだと思っています。これはItemDetail "is-a" PurchaseDetail(継承のリトマステスト)のようには見えません。モデルを変更し、まだ問題がないかどうかを確認してください。 –

関連する問題