2016-10-02 2 views
0

でリストをバインドする方法をここに私のシナリオです:私は強く今、私は別の内側のこの部分のビューをレンダリングしたいは<SimpleObject> MVC

@model SimpleObject 
    <div> 
     <input type="button" value="Button" name="btn" /> 
     <div> 
      <div> 
       @Html.TextBoxFor(Model => Model.FirstName, new { @class = "", @maxlength = "50" }) 
      </div> 
      <div> 
       @Html.TextBoxFor(Model => Model.LastName, new { @class = "", @maxlength = "50" }) 
      </div> 

SimpleObjectのための部分的なビューを入力作成した

public class ComplexObject 
{ 
    public int SomeProperty {get;set;} 
    public List<SimpleObject> Object {get;set;} 
} 

public class SimpleObject 
{ 
public string FirstName {get;set;} 
public string LastName {get;set;} 

} 

ビュー(MainView)。ユーザーがSimpleObjectの部分表示ボタンをクリックし、 がMainViewで同じ部分表示を再度生成できるという考え方です。私はAjaxのアクションを作成し、単純なビューを生成し、MAINVIEWするためにそれを追加することができ

MainView 
    SimpleView -> Add 
     SimpleView -> Add 

が、問題はsimpleobjectがComplexObjectに結合されていないということですので、ここでそれがどのように見えるかです。

これは、MainViewでpartialviewをレンダリングする方法です。

@Html.Partial("_PartialView", Model.SimpleObject, new ViewDataDictionary(ViewData) 
{ 
    TemplateInfo = new System.Web.Mvc.TemplateInfo 
    { 
     HtmlFieldPrefix = "Simple" 
    } 
}) 

MAINVIEWはクリックし提出し、全体ComplexObjectが提出された上でのコントローラのアクションを呼び出します。ここで私のリストSimpleObjectは常にNULLです。

public ActionResult CreateComplex(ComplexObject object) 
{ 
    // HERE LIST<SIMPLEOBJECT> is always NULL 
} 

私はここで間違っていますか?

+1

で始まるあなたは 'にインデクサを追加することではないので、自分自身で' partial'が動作しません。 name'属性を使用します。いくつかのオプションについては、[この回答](http://stackoverflow.com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308)を参照してください。 –

答えて

0

あなたはこのようなものを持っています部分ビューをレンダリングする最初の時間は:

<div> 
     <input type="text" name="FirstName" maxlength="50" /> 
</div> 
<div> 
     <input type="text" name="LasttName" maxlength="50" /> 
</div> 

あなたが最後に、ページに複数の部分的なビューを追加する場合のみ2テキストボックスには、に掲載されます彼らはすべて同じ名前を持っているからです。

この問題を解決するには、入力ボックスを配列のようにするためにパーシャルビューを変更する必要があります。モデルにプロパティを追加し、アクションから設定しますコードは次のようになります

@model SimpleObject 
    <div> 
     <input type="button" value="Button" name="btn" /> 
     <div> 
      <div> 
       @Html.TextBox("FirstName["+Model.Index+"]", new { @class = "", @maxlength = "50" }) 
      </div> 
      <div> 
       @Html.TextBox("LastName["+Model.Index+"]", new { @class = "", @maxlength = "50" }) 
      </div> 

各ボタンをサブミットすると、インデックスがインクリメントされてビューがレンダリングされます。

別の解決策は、部分的なビューを削除し、JavaScriptを使用して入力ボックスを追加することで、あなたは

ノックアウト使用することができ、それを行う方法を説明し、この記事を見て:ここではhttp://knockoutjs.com/examples/grid.html

0

ですSimpleObjectsのリストをComplexObjectにバインドするために、元の質問で投稿したコードを変更しました。

@Html.Partial("_PartialView") 

クラス次のようになります。

public class ComplexObject 
{ 
    public int SomeProperty {get;set;} 
    public List<SimpleObject> Objects {get;set;} 
} 

とpartialviewがBeginCollectionItem

@model AZSolutions.Framework.Model.SimpleObject 
@using (Html.BeginCollectionItem("Objects")) { 
... 
} 
関連する問題