2016-12-01 21 views
-1

私は1つのビューに結合する必要がある2つのモデルがあります。最初のモデル複数のモデル単一のビューAsp.net mvc

class MainTransaction 
    public MainTransaction() 
    { 
     this.SubTransactions = new HashSet<SubTransaction>(); 
    } 

    public int id { get; set; } 
    public System.DateTime TransactionDate { get; set; } 
    public string bank { get; set; } 
    public string narration { get; set; } 
    public string RecievedFrom { get; set; } 
    public string VoucherType { get; set; } 
    public string VoucherNo { get; set; } 
    public string description { get; set; } 
    public string DistrictCode { get; set; } 


    public virtual ICollection<SubTransaction> SubTransactions { get; set; } 
} 

両方のモデルが関連している

public class SubTransaction 
{ 
    public int id { get; set; } 
    public int MainTransactionId { get; set; } 
    public int HeadCode { get; set; } 
    public int subsidiary { get; set; } 
    public int fund { get; set; } 
    public int district { get; set; } 
    public int sector { get; set; } 
    public int gender { get; set; } 
    public double debit { get; set; } 
    public double credit { get; set; } 
    public string payee { get; set; } 
    public string ChequeNo { get; set; } 
    public string AccountDescription { get; set; } 

    public virtual District District1 { get; set; } 
    public virtual Fund Fund1 { get; set; } 
    public virtual Head4 Head4 { get; set; } 
    public virtual MainTransaction MainTransaction { get; set; } 
    public virtual Sector Sector1 { get; set; } 
    public virtual Subsidiary Subsidiary1 { get; set; } 
} 

セカンドモデル。このモデルに基づいて、両方のモデルのプロパティを含むビューバウチャーを作成する必要があります。ビューにこのモデルを渡すために、私は別のモデルバウチャー

public class Voucher 
{ 
    public MainTransaction mt {get;set; 
    public List<SubTransaction> st {get;set;}; 
} 

ビュー @model ModelFormBindingTutorial.Models.Voucher @ { ViewBag.Title = "CreateVoucher" を作成しました。 }

<form method="post" action="StoreVoucher"> 
    <table border="1" class="table-bordered table-condensed table-hover" > 
    <tr> 
     <th>TransactionDate</th> 
     <th>Bank</th> 
     <th>Narration</th> 
     <th>RecievedFrom</th> 
     <th>VoucherType</th> 
     <th>Voucher No.</th> 
     <th>Description</th> 
     <th>DistrictCode</th> 
    </tr> 

    <tr> 

     <td>@Html.TextBoxFor(m => m.mt.TransactionDate, new { @Value = "12/12/2014" })</td> 
     <td>@Html.TextBoxFor(m => m.mt.bank, new { @Value = "Allied Bank" })</td> 
     <td>@Html.TextBoxFor(m => m.mt.narration,new { @Value = "Some Stuff Going on"})</td> 
     <td>@Html.TextBoxFor(m => m.mt.RecievedFrom, new { @Value = "Recieved From" })</td> 
     <td>@Html.TextBoxFor(m => m.mt.VoucherType, new { @Value = "BPV" })</td> 
     <td>@Html.TextBoxFor(m => m.mt.VoucherNo, new { @Value = "BPV-12-2016-GGG" })</td> 
     <td>@Html.TextBoxFor(m => m.mt.description, new { @Value = "Some Description" })</td> 
     <td>@Html.TextBoxFor(m => m.mt.DistrictCode, new { @Value = "001" })</td> 


    </tr> 

</table><br /> 

<table border="1" class="table-bordered table-condensed table-hover"> 
<tr> 
    <th> 

    </th> 
</tr> 
    <tr> 
     <th style="width:120px">HeadCode</th> 
     <th style="width:70px">Subsidiary</th> 
     <th style="width:70px">Funds</th> 
     <th style="width:70px">District</th> 
     <th style="width:70px">Sector</th> 
     <th style="width:70px">Gender</th> 
     <th style="width:200px">Debit</th> 
     <th style="width:200px">Credit</th> 
     <th>Payee</th> 
     <th>ChequeNo</th> 
     <th>AccountDescription</th> 

    </tr> 

    @for (var i = 1; i < 3; i++) 
    { 
     <tr> 


      <td>@Html.TextBoxFor(v => v.st[i].HeadCode, new { @Value = "001" })</td> 
      <td>@Html.TextBoxFor(v => v.st[i].subsidiary, new { @Value = "002" })</td> 
      <td>@Html.TextBoxFor(v => v.st[i].fund, new { @Value = "003" })</td> 
      <td>@Html.TextBoxFor(v => v.st[i].district, new { @Value = "004" })</td> 
      <td>@Html.TextBoxFor(v => v.st[i].sector, new { @Value = "005" })</td> 
      <td>@Html.TextBoxFor(v => v.st[i].gender, new { @Value = "01" }) 
      </td> 
      <td>@Html.TextBoxFor(v => v.st[i].debit, new { @Value = "40000" })</td> 
      <td>@Html.TextBoxFor(v => v.st[i].credit,new { @Value = "5005"})</td> 
      <td>@Html.TextBoxFor(v => v.st[i].payee, new { @Value = "Biltoon Gulab" })</td> 
      <td>@Html.TextBoxFor(v => v.st[i].ChequeNo, new { @Value = "4204" })</td> 
      <td>@Html.TextBoxFor(v => v.st[i].AccountDescription, new { @Value = "Some Description" })</td> 


    </tr> 

    } 
</table><br /> 

<div style="float:right; width:400px" > 
    <input size="23" type="text" value="Total" /> 
</div> 


<input type="submit" class="btn btn-default" /> 

そしてビューで、私はクーポンモデルを渡します。フォームが送信されると、コントローラアクションで、MainTransactionのオブジェクトが作成されますが、SubTransactionは常にNullを返します。私はなぜSubTransactionがNullであるのか、MainTransactionオブジェクトが作られる理由を理解できません。

任意の提案

+0

はい:あなたは、フォームを送信する前副トランザクションを設定していない場合常にnullです。 "Html.HiddenFor(x => x.st)"(ビュー内)またはそのようなものを試して、Voucher.stを保存してください。 – itmuckel

+0

最初の問題は、それらがフィールドであり、プロパティではないことです(フィールドは 'DefaultModelBinder'によって束縛されません)。彼らはまた公開されていません - 'public MainTransaction mt {get; set} public List <サブトランザクション> st {get;セット; } ' –

+0

ViewでSubTransactionにデータを設定していますか?もしそうでなければ、なぜそれをコントローラからビューに渡していますか? –

答えて

-1

あなたは、単一のビュー内の複数のモデルのプロパティにアクセスするには、部分図を使用することができます。

+1

OPは、コードが機能していない理由を尋ねています(悪い選択肢は求めません) –

0

私は同じ問題に直面し、方法を解決しました。

  1. コントローラからモデル値を送信します。

  2. バウチャーモデルを変更してください。

  3. cshtmlのリスト項目数を取得します。

  4. Loop through your ListLength count。

これは機能しています。最後に確認してください。

コード:

処置:

public ActionResult Index() 
    { 
     Voucher v = new Voucher(); 
     SubTransaction objst = new SubTransaction(); 
     objst.HeadCode = 001; 
     objst.subsidiary = 2; 
     objst.fund = 3; 
     objst.district = 4; 
     objst.sector = 5; 
     objst.gender = 61; 
     objst.payee = "payee1"; 
     v.st.Add(objst); 

     objst = new SubTransaction(); 
     objst.HeadCode = 001; 
     objst.subsidiary = 2; 
     objst.fund = 3; 
     objst.district = 4; 
     objst.sector = 5; 
     objst.gender = 61; 
     objst.payee = "payee2"; 
     v.st.Add(objst); 

     return View(v); 
    } 

クーポンモデル:

public class Voucher 
    { 
     public Voucher() 
     { 
      st = new List<SubTransaction>(); 
     } 
     public MainTransaction mt { get; set; } 
     public List<SubTransaction> st { get; set; } 
    } 

ビュー:

@{ 
    int ListLength=0; 
    if(Model.st!=null) 
    { 
    ListLength = Model.st.Count(); 
    } 
} 




    @for (var i = 0; i < ListLength; i++) 
     { 
      <td>@Html.TextBoxFor(v => v.st[i].HeadCode)</td> // If you want to load data from model 
      @*<td>@Html.TextBoxFor(v => v.st[i].HeadCode,new { @Value = "001" })</td>*@ // if you want to hard code the data. 
     } 
+0

動作しません。このイメージの出力。 Listの長さは0で、null参照例外(ビューまたはコントローラ)を取得しているところで、ヌル参照例外http://i66.tinypic.com/mh6kyb.png – user2018756

+0

が返されます。バウチャーモデルを変更していますか? Actionメソッドからバウチャーモデルを返却しましたか?私の最後には同じコードがうまくいきます。 – Anadi

+0

コントローラ私は前のコメントで画像を添付 – user2018756

関連する問題