2017-04-11 10 views
1

私は今週、単純なasp.netアプリケーションに取り組んでいます。そして、今日私は、私のコントローラメソッドに何も返さないという鋭い視点で問題を抱えていました。ビューは、リスト<>内のいくつかのオブジェクトを戻さなければなりませんでした。asp.net mvcビューはforループを使用すると返ります

私はついにオブジェクトのリストをビューに渡し、 'for'ループでループしていました。 foreachループで今日も試しましたが、うまくいきませんでした。

私はビューに空のオブジェクトのリストを渡し、次のGETメソッドを持っている:

// GET: MpSwitches/CreateSeveral 
    public ActionResult CreateSeveral() 
    { 
     var mpSwitches = new List<MpSwitch> 
     { 
      new MpSwitch() {IpAdress = "1"}, 
      new MpSwitch() {IpAdress = "2"}, 
      new MpSwitch() {IpAdress = "3"}, 
      new MpSwitch() {IpAdress = "4"}, 
      new MpSwitch() {IpAdress = "5"} 
     }; 
     // Check if the user gets redirected to this method because of a First Time Startup. 
     if (TempData["RedirectFirstTimeStartup"] != null) 
     { 
      ViewBag.FirstTime = 
       "Je bent doorgestuurd naar deze pagina omdat er nog geen MP-switches in de database staan."; 
      return View(mpSwitches); 
     } 
     return View(mpSwitches); 
    } 

は、次に表示があります:

@model List<WebInterface.Models.MpSwitch> 
@{ 
    ViewBag.Title = "Create several"; 
} 
<h2>Create several</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>MpSwitch</h4> 
     @if (ViewBag.FirstTime != null) 
     { 
      <div class="alert-warning"> 
       <b>Opgelet! </b>@ViewBag.FirstTime 
      </div> 
     } 
     @for (int i = 0; i < Model.Count; i++) 
     { 
      <hr /> 
      @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
      <div class="form-group"> 
       @Html.LabelFor(model => model[i].IpAdress, htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.EditorFor(model => model[i].IpAdress, new { htmlAttributes = new { @class = "form-control" } }) 
        @Html.ValidationMessageFor(model => model[i].IpAdress, "", new { @class = "text-danger" }) 
       </div> 
      </div> 
     } 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

私の質問は:「なぜdoesnのこの同じコードは 'for'ループではなく 'foreach'で動作しますか?

現在動作していないコード:foreachループを使用する場合

@foreach (var item in Model) 
    { 
     <hr /> 
      @Html.ValidationSummary(true, "", new { @class = "text-danger"}) 
      <div class="form-group"> 
      @Html.LabelFor(modelItem => item.IpAdress, htmlAttributes: new { 
    @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(modelItem => item.IpAdress, new { 
    htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(modelItem => item.IpAdress, "", new 
    { @class = "text-danger" }) 
      </div> 
     </div> 
    } 

を以下のコントローラメソッドは、(パラメータがnull)パラメータを取得しません。

// POST: MpSwitches/CreateSeveral 
    // To protect from overposting attacks, please enable the specific 
    properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult CreateSeveral([Bind(Include = 
    "Id,IpAdress,LastSyncDateTime")] List<MpSwitch> mpSwitches) 
    { 
     if (ModelState.IsValid) 
     { 
      foreach (var mpSwitch in mpSwitches) 
      { 
       db.MpSwitches.Add(mpSwitch); 
      } 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(mpSwitches); 
    } 

、私は次のエラーを取得する:あなたが取得していないLink to image of my error

+1

動作していないコードを投稿できますか? foreachのコード – Kevin

+0

! –

+0

私は動作していないコードを追加しました – Jeroen

答えて

0

foreach loopを使用しているときにレンダリングされたHTMLを見れば、あなたがこの

<input class="form-control text-box single-line" id="item_IpAdress" name="item.IpAdress" value="" type="text"> 

を取得し、あなたがfor loopを使用するときにあなたがそうするとき、あなたをList<MpSwitch>を使用しているので、それがこの

<input class="form-control text-box single-line" id="MpSwitch_0__IpAdress" name="MpSwitch[0].IpAdress" value="" type="text"> 

のようになりますfor loopのフォームをMpSwitch[0].IpAdressに送信すると、IpAddressの新しい値がMpSwitchに割り当てられ、index 0に割り当てられ、foreach loopの値はitem.IpAdressに割り当て、List<MpSwitch>nullとなります。複雑なオブジェクトをバインドするためには、各アイテムにインデックスを付ける必要があります。あなたもこれをチェックすることができますModel Binding To A List

0

の理由は、あなたの代わりにforforeachを使用する場合、アイテムのインデックスと持っていないということですHTML要素の名前/ idsが重複しています。ブラウザに送信しているHTMLソース(ページソースの表示または要素の検査)を見てください。foreachを使用すると、MpSwitch.IpAddressのみになります。それをコレクションに直列化することはできません。

0

MVC ModelBinderは、リストアイテムのインデックスをViewModelに正しくバインドする必要があります。

ループを使用する場合、正しいインデックスは、生成されたHTML <input>要素のidおよびname属性に組み込まれます。

インデックスを明示的に組み込むこともできます。Binding arrays with missing elements in asp.net mvcを参照してください。

関連する問題