2016-06-02 8 views
1

私はasp.netのMVC-4 Webアプリケーション内の私の見解内側次のコードを持っている: - 今私が達成しようとしています何インデックスが範囲外です。負でなく、コレクションのサイズより小さくなければなりません。パラメータ名:インデックス

@model IList<TS.ViewModels.ACCOUNTLIST> 

@for(int i2 = 0; i2 < (Model.Count() <= 0 ? 5 : Model.Count()); i2++) { 

    <div> 

     <span >@Html.DisplayFor(m => m[i2].ACCOUNTNAME) </span>@Html.EditorFor(m => m[i2].ACCOUNTNAME) </div> 
      <div> 

     <span >@Html.DisplayFor(m => m[i2].PASSWORD) </span>@Html.EditorFor(m => m[i2].PASSWORD) </div> 
      <div> 

     <span >@Html.DisplayFor(m => m[i2].NOTES) </span>@Html.EditorFor(m => m[i2].NOTES) </div> 

} 

があればフィールドの5つの空のセットを表示することですモデルは空です。そして、で、ケースモデルは、関連する日付を表示するためのデータが含まれている..しかし、私はビューをレンダリングし、渡されたモデルが空の場合、現在、私は次の例外を取得します: -

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index 

が、私はHtml.DisplayHtml.Editorを使用している場合以下のように、私の見解はうまくいくでしょう: -

@for(int i2 = 0; i2 < (Model.Count() <= 0 ? 5 : Model.Count()); i2++) { 

    <div> 

     <span class="f">@Html.Display("["+i2.ToString()+"].ACCOUNTNAME") </span>@Html.Editor("["+i2.ToString()+"].ACCOUNTNAME") 


     <span class="f">@Html.Display("["+i2.ToString()+"].PASSWORD") </span>@Html.Editor("["+i2.ToString()+"].PASSWORD") </div> 




} 

だから誰でもこのようにしてください。私はなぜ私のケースでHtml.DisplayFor & Html.EditorForを使用できないのですか?

+2

の線に沿って何かを持っています0 '、あなたは 'm [0]'を求めるときに何が起こると思いますか? – AakashM

+0

あなたの 'のための'は奇妙です - あなたはテナーリーの正しい真と偽の部分を持っていると確信していますか? –

+0

@AakashMは空の入力とラベルをレンダリングするようになりました.Html.DisplayforとHtml.EditorforをHtml.Display&Html.Editorに置き換えると、正常に動作します。 –

答えて

2

問題は存在しないコレクションからアイテムを取得しようとしているあります。例3のコレクションからオブジェクト4にアクセスしようとしています。

問題を解決するには、ビューから条件を削除し、代わりにコントローラに入れます。空のエントリを表示したい場合将来的にビューを変更する必要はありません。

以下で文のビューを交換してください:あなたのモデルが空であり、そのためその `Count`が`とき

@for (var i2 = 0; i2 < Model.Count; i2++) 
{ 
    <div> 
     <span>@Html.DisplayFor(m => m[i2].ACCOUNTNAME)</span>@Html.EditorFor(m => m[i2].ACCOUNTNAME) 
    </div> 
    <div> 
     <span>@Html.DisplayFor(m => m[i2].PASSWORD) </span>@Html.EditorFor(m => m[i2].PASSWORD) 
    </div> 
    <div> 
     <span>@Html.DisplayFor(m => m[i2].NOTES) </span>@Html.EditorFor(m => m[i2].NOTES) 
    </div> 
} 

次に、あなたのコントローラ内部では

// Replace this with your method of retrieving the accounts list 
var accounts = new List<ACCOUNTLIST>(); 

const int maxEntries = 5; 

while (accounts.Count < maxEntries) 
{ 
    accounts.Add(new ACCOUNTLIST()); 
} 

return View(accounts); 
+0

DisplayForとEditorForを使用して非exsitingデータにアクセスすることは問題ではありません!その証拠は、私がHtml.DisplayとHtml.Editorをdisplayforとeditorの代わりに使用すると、意図したロジックが正常に動作するということです。 –

+1

これは、DisplayとEditorがモデルに強く型付けされていないためです。したがって、コレクションからアイテムを取得しようとしません。また、モデルからの値をバインドしないので、空白の入力フィールドのみが表示されます。 –

+0

提出のバインディングは、ディスプレイに渡す式が正しいものとして機能します。しかし、UIのデータを持つ3つのアカウントのコレクションがここに示すように値をバインドしないと言うと、[Screenshot of UI](http://i.imgur.com/POyUwDN.png) –

0

あなたは空のモデルのデータ収集をバインドしているようです。空のリストを送信する代わりに、アクション結果にモデルコレクションのデフォルト値を設定してレンダリングする方が良いでしょう。

i2 < (Model.Count() <= 0 ? 5 : Model.Count()); 

はそれは何を述べてはならばというモデルである。そして、代わりにこの状態は少し奇妙な..ですあなたのモデルがnullの場合、あなただけのデフォルト値をチェックし、それに応じてフィールドを作成

1

をチェックしますcountがゼロ以下であれば5回、そうでなければ "model count"回ループする。

モデルが空の場合、存在しないModelの最初の5つの要素にアクセスしようとします。したがって、エラーです。

あなたはカウントが明示的にゼロとコードである場合に、自動的決定する必要があります。

if (Model.Count() > 0) 
{ 
    @for(int i2 = 0; i2 < Model.Count(); i2++) 
    { 
    } 
} 
else 
{ 
    Do something else 
} 
+0

どのようにモデルが空の場合、私のDisplay-forとEditorForの空のセットを5つレンダリングするかを指定することができます。モデルに関連する値がない場合、DisplayForとEditorForは空の名前と入力フィールド、 、ここでは例外的なことは何もありません。たとえば、作成ビューをレンダリングすると、モデルは空になりますが、DisplayforとEditorforは空のビューを表示します!! .. 2番目のポイントなぜHtml.DisplayとHtml.Editorを使用すると、意図したロジックが正常に動作しますか? –

+0

@johnG I私は恐れていると答えてasp.netについて十分に知りません。 – ChrisF

+0

大丈夫ですが、EditorForとDisplayForのやり方は、関連する値を見つけようとすると、空の名前と入力フィールドをレンダリングします。最後に、私の場合はHtml.Display&Html.Editorを使用します。正常に動作するので、私のロジックは正しいですが、Html.DisplayforとHtml Editorを使用する場合には限界があるようです –

関連する問題

 関連する問題