2014-01-27 149 views
1

我試圖獲取用戶選中複選框的Id值列表。這裏的模型:從複選框複選框中獲取值

using System.Collections.Generic; 

namespace TestWebApplication3.Models 
{ 
    public class TestViewModel 
    { 
     public IEnumerable<InnerViewModel> ModelData { get; set; } 

     public class InnerViewModel 
     { 
      public int Id { get; set; } 

      public bool Checked { get; set; } 
     } 
    } 
} 

控制器:

using System.Web.Mvc; 
using TestWebApplication3.Models; 

namespace TestWebApplication3.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      var test = new TestViewModel(); 

      test.ModelData = new[] 
      { 
       new TestViewModel.InnerViewModel {Id = 10}, 
       new TestViewModel.InnerViewModel {Id = 20}, 
       new TestViewModel.InnerViewModel {Id = 30}, 
       new TestViewModel.InnerViewModel {Id = 40} 
      }; 

      return View(test); 
     } 

     [HttpPost] 
     public string TestAction(TestViewModel model) 
     { 
      string s = ""; 
      foreach (TestViewModel.InnerViewModel innerViewModel in model.ModelData) 
      { 
       if (innerViewModel.Checked) 
        s += innerViewModel.Id + " "; 
      } 
      return s; 
     } 
    } 
} 

和視圖:

@model TestWebApplication3.Models.TestViewModel 

@using (Html.BeginForm("TestAction", "Home")) 
{ 
    <ol> 
     @foreach (var testData in Model.ModelData) 
     { 
      <li> 
       @Html.HiddenFor(m => testData.Id) 
       @Html.CheckBoxFor(m => testData.Checked) 
      </li> 
     } 
    </ol> 

    <input type="submit"/> 
} 

所以我顯示InnerViewModel對象的列表(在指數中的動作)的複選框。當用戶提交表單時,我想以某種方式獲取在TestAction方法中「檢查」的Id值列表。但返回模型始終爲空。

在應用程序中,我使模型有更多的屬性,因此重要的是InnerViewModel對象的列表嵌套在TestViewModel中。我也不想使用像MvcCheckBoxList這樣的第三方解決方案,因爲在我看來,這對於這樣一個簡單的任務來說是過度的。

任何人都可以向我解釋什麼是缺少這個工作?

回答

1

我稍微改變了你的代碼,使其工作 -

視圖模型 -

public class TestViewModel 
{ 
    public List<InnerViewModel> ModelData { get; set; } 
    public class InnerViewModel 
    { 
     public int Id { get; set; } 
     public bool Checked { get; set; } 
    } 
} 

控制器 -

public ActionResult Index() 
    { 
     var test = new TestViewModel(); 

     test.ModelData = new List<TestViewModel.InnerViewModel>() 
     { 
      new TestViewModel.InnerViewModel {Id = 10}, 
      new TestViewModel.InnerViewModel {Id = 20}, 
      new TestViewModel.InnerViewModel {Id = 30}, 
      new TestViewModel.InnerViewModel {Id = 40} 
     }; 

     return View(test); 
    } 

    public string TestAction(TestViewModel model) 
    { 
     string s = ""; 
     foreach (TestViewModel.InnerViewModel innerViewModel in model.ModelData) 
     { 
      if (innerViewModel.Checked) 
       s += innerViewModel.Id + " "; 
     } 
     return s; 
    } 

視圖 -

@model MVC.Controllers.TestViewModel 

@using (Html.BeginForm("TestAction", "Home")) 
{ 
    <ol> 
     @for (int i = 0; i < Model.ModelData.Count() ; i++) 
     { 
      <li> 
       @Html.HiddenFor(m => m.ModelData[i].Id) 
       @Html.CheckBoxFor(m => m.ModelData[i].Checked) 
      </li> 
     } 
    </ol> 

    <input type="submit" /> 
} 
0

複雜對象需要建立索引,以便模型綁定來接他們。

改成這樣這樣的型號粘合劑將它們撿起來:

@for (int i = 0; i < Model.ModelData.Count; i++) 
    { 
     <li> 
      @Html.HiddenFor(m => Model.ModelData[i].Id) 
      @Html.CheckBoxFor(m => Model.ModelData[i].Checked) 
     </li> 
    } 

這是一個很好的文章,解釋了一些陷阱的模型綁定。

http://msdn.microsoft.com/en-us/magazine/hh781022.aspx

+0

更改的foreach到的並沒有真正在事物的宏偉計劃的任何區別,更不用說真正使解決此問題的一個差別......他們都做同樣的事情到底。 – IyaTaisho

+1

@IyaTaisho這是不正確的。在這種情況下,您必須使用for而不是foreach來使模型聯編程序正常工作。 –

+0

@digitalid謝謝同意,我也投了票。難以置信的。 :) – hutchonoid