2017-03-21 11 views
2

私はViewModel - Customerを持っています。ViewModelでIEnumerableをバインドしていない

...output customer info.... 
<div class="col-md-9"> 
    @{ 
     foreach (var Tag in Model.Tags) 
     { 
      @Html.DisplayFor(x => Tag.TagNo); 
      <br /> 
     } 
    } 
</div> 

私はタグを非表示にしようとしています: - - スカラー顧客情報と一緒にforeachのを使用して

public class Tag 
{ 
    public int TagNo{ get; set; } 
    public DateTime CreatedDate { get; set; } 
} 

I出力ページへのタグの一覧:この内のIEnumerableコレクションがありますモデルバインダーのためのページ内のリスト私は再びデータベースをヒットする必要はありませんエラーになる:

0123:

@{ 
    int[] tagArray = Model.Tags.Select(x => x.TagNo).ToArray(); 

    for (int i = 0; i < Model.Tags.Count(); i++) 
    { 
     @Html.Hidden("Tags[" + i + "]", tagArray[i]) 
    } 
} 

は、これは、この出力します

Creating HiddenFor IEnumerable<String> in View

しかし、とき:例えば - 私はあなたがモデルバインダーは、結合リストに理解することに一定の形式で(上記のように)配列を使用することができますと言って上の様々な質問を見ている

<input id="Tags_0_" name="Tags[0]" type="hidden" value="21111111" /> 
etc 

ページにエラーがあり、デバッガを使用してポストに何がバインドされているかを確認します.3つの要素があるように見えますが、すべて空です。

@Html.Hidden("Tags[" + i + "].TagNo", tagArray[i]) 

をしかしCustomer.Tagsコレクションは、投稿後に空である:

また、私はこれを試してみました。

私は間違っていますか?モデルのバインダーに表示されるように、ページのこのタグのリストを非表示にするにはどうすればよいですか?

+0

強く型付けされたヘルパーを使用してください - '@ Html.Hidden(M => M [i]の.Tags.TagNo)'( 'CreatedDate'用同上)ので、あなたが生成します正しいhtml。しかし、なぜあなたはこれをやっているのですか?必要に応じてPOSTメソッドでコレクションをもう一度入手してください。その余分なHTMLをすべて生成してクライアントに送信し、それをそのまま元に戻して送信するだけでは、パフォーマンスが低下します。 'Tags'プロパティは' IList ' –

+0

Thxである必要があることに注意してください。私はこれをやっていますので、モデルエラーがあればリストを再度取得するためにデータベースにヒットする必要はありませんか?私は明白な何かを欠いていますか – niico

+0

クライアント側の検証を設定している場合は、まれにヒットする必要があります。 –

答えて

1

あなたのモデルのプロパティはIEnumerable<Tag>ですが、int[]と表示されている次のラインです。

あなたは、私がお勧め

@{ 
    int[] tagArray = Model.Tags.Select(x => x.TagNo).ToArray(); 

    for (int i = 0; i < Model.Tags.Count(); i++) 
    { 
     @Html.Hidden("Tags[" + i + "]", tagArray[i]) 
    } 
} 

@for (int i = 0; i < @Model.Tags.Count; i++) 
{ 
    <input id="[email protected](i)__TagNo" name="Tags[@i].TagNo" type="hidden" value="@Model.Tags[i].TagNo" /> 
} 

に変更必要とするような状況のためのエディタのテンプレートを使用して

\ビュー\共有\ EditorTemplates \ Tag.cs​​html:

@model mvcTest.Models.Tag 
@Html.HiddenFor(a => a.TagNo) 

親ビュー:

@for (int i = 0; i < @Model.Tags.Count; i++) 
{ 
    @Html.EditorFor(a => a.Tags[i]) 
} 
+0

'EditorTemplate'を使うと、その' @ Html.EditorFor(a => a。タグ) ' - ループは不要 - このメソッドは' IEnumerable 'を受け取り、コレクション内の各項目の正しいhtmlをレンダリングします。 –

関連する問題