2011-08-22 2 views
2

レシピを記録できるアプリケーションを作成しています。レシピの基本を追加できるビューを作成しようとしています。レシピ名、レシピの日付、使用される材料は&で調理されています。私のコントローラviewmodelは私のダイナミックビューモデルで埋められていません

一部のjqueryを含むビューを作成してクライアント側の部分ビューを読み込みます。

jqueryを使用してロードされた部分ビューから値を取得しようとすると、いくつかの問題が発生しています。

Aは私の部分図が

<div class="ingredient-name"> 
    @Html.LabelFor(x => Model.IngredientModel.IngredientName) 
    @Html.TextBoxFor(x => Model.IngredientModel.IngredientName) 
</div> 
<div class="ingredient-measurementamount"> 
    @Html.LabelFor(x => Model.MeasurementAmount) 
    @Html.TextBoxFor(x => Model.MeasurementAmount) 
</div> 
<div class="ingredient-measurementtype"> 
    @Html.LabelFor(x => Model.MeasurementType) 
    @Html.TextBoxFor(x => Model.MeasurementType) 
</div> 

コントローラーポストのよう

[HttpPost] 
    public ActionResult Create(RecipeViewModel vm,IEnumerable<string>IngredientName, IEnumerable<string> MeasurementAmount, IEnumerable<string> MeasurementType) 
    { 
に見える

<div id="ingredients"> 
     @{ Html.RenderPartial("_AddIngredient", new IngredientViewModel()); } 
    </div> 
    <script type="text/javascript"> 
    $(document).ready(function() { 
    var dest = $("#ingredients"); 
    $("#add-ingredient").click(function() { 
     loadPartial(); 
    }); 
    function loadPartial() { 
     $.get("/Recipe/AddIngredient", {}, function (data) { $('#ingredients').append(data); }, "html"); 
    }; 
}); 
</script> 

(私は最初に1つの部分図がロードされたい)のように私のメインビューのバージョンは見え削減

最後に私のビューモデルは次のようになります

public class IngredientViewModel 
{ 
    public RecipeModel RecipeModel { get; set; } 
    public IEnumerable<IngredientModel> Ingredients { get; set; } 

} 

私のコントローラは、I上のすべてが移入されるだろう理想的には私がhttppost原材料に考え、MeasurementAmount & MeasurementType(IngredientNameは常にnullを返します)の値を取得するためにInumerbleを使用して......イムかなり醜いです可能な成分が入っている

私の部分的なビューから私のコントローラに値を取得するには何が必要ですか?

答えて

2

に例を見つけることができます。

+0

歓声シェーン。そのツールキットはかなりクールです! –

0

あまり詳しく説明しません。ビューモデルではなくFormCollectionを使用するようにpublic ActionResult Createを変更できますか?これにより、もしあれば、どのデータが通って来るのかを見ることができます。あなたがそれを投稿することができれば助けになるでしょう。

あなたのビューモデルはBindingを使用して読み込まれます。あなたがそれについて読んでいない場合は、それを行うことをお勧めします。最後に、リストや列挙型を単一のビューモデルにラップすることを検討します。

0

考えられる問題

問題はあなただけでレンダリングされた新しい部分を正確にあなたが後で投稿するあなたのViewModelにバインドされていないという事実に置くことができます。

あなたは放火犯を持つ要素を検査した場合、一部の要素は、このような何かId'ed /名前を付ける必要があります。成分[X] .Property1、成分[X] .Property2など

Inをあなたの状況を部分的に追加すると、おそらく単にProperty1、Property2と呼ばれます。

解決策

はあなたの部分に成分のリストに対応する正しい名前をあなたの特性を与えます。

@Html.TextBox("Ingredients[x].Property1","") 

のうち、部分をレンダリングした後、jqueryのjqueryのすべての名前を正しい値に変更するだけです。

0

これは、部分ビューのフィールド名がデフォルトのModelBinderの規則に適合しないために発生します。部分的なビューにどの名前フィールドがあるかを分析する必要があります。

また、コレクションをMVCコントローラにバインドする正しい方法を実装する必要があります。あなたは、私は、彼らはあなたがやりたいと思うMVC Controlstoolkit

を見ていないのはなぜあなたはPhil's Haack post

0

RecipeViewModelが部分図に供給されているモデルであると仮定すると、ちょうどこのようなあなたのPOSTコントローラにその背中を受け入れてみてください。

[HttpPost] 
public ActionResult Create(RecipeViewModel vm) 
{ 
    // 
} 

あなたはモデルの形式で提供されるすべての値が移入されるはずです。

関連する問題