2013-05-10 86 views
0

我正在製作基於ASP .NET MVC4的應用程序。我在這個領域是一個完整的新手。這個想法很簡單 - 在DB中有一些成員,顯示他們列出,通過複選框選擇所需的人,並重定向到其他控制器,這些控制器會對先前選擇的成員做些什麼。Viewmodel IEnumerable屬性爲空

問題是將成員列表從View傳遞給Controller。我以爲它可以與ViewModel一起使用。它當然可以從Controller到View,但不是其他方式。

我的視圖模型:

public class MembersViewModel 
{ 
    public IEnumerable<Directory_MVC.Models.Member> MembersEnum { get; set; } 

    public string Test { get; set; } 
} 

摘錄我的控制器:

public class MembersController : Controller 
{ 
    private MainDBContext db = new MainDBContext(); 

    public ActionResult Index() 
    { 
     var model = new Directory_MVC.ViewModels.MembersViewModel(); 

     // populating from DB 
     model.MembersEnum = db.Members.Include(m => m.Group).Include(m => m.Mother).Include(m => m.Father); 

     model.Test = "abc"; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult GoToSendEmail(Directory_MVC.ViewModels.MembersViewModel returnedStruct) 
    { 
     if (ModelState.IsValid) 
     { 
      // it is valid here 
      return Redirect("http:\\google.com"); 
     } 
    } 

摘錄我的觀點:

@model Directory_MVC.ViewModels.MembersViewModel 


@{ 
ViewBag.Title = "Members listing"; 

var lineCount = 0; 
string lineStyle; 
} 

@using (Html.BeginForm("GoToSendEmail", "Members", FormMethod.Post)) 
{ 
<table> 
@foreach (var item in Model.MembersEnum) 
{ 
    lineCount++; 

    // set styling 
    if (lineCount % 2 == 1) 
    { 
     lineStyle = "odd-line"; 
    } 
    else 
    { 
     lineStyle = "even-line"; 
    } 

    <tr class="@lineStyle"> 
     <td> 
      @Html.EditorFor(modelItem => item.Selected) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.FirstName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.LastName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Mother.FirstName) @Html.DisplayFor(modelItem => item.Mother.LastName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Father.FirstName) @Html.DisplayFor(modelItem => item.Father.LastName) 
     </td> 
    <!-- other print-outs but not all properties of Member or Mother/father are printed --> 
    </tr> 
} 

</table> 

<input type="submit" value="Send E-mail" /> 
} 

數據顯示在查看確定。但是,當我提交該表單時,控制器方法GoToSendEmail中的returnedStruct.MembersEnum和Test字符串都爲空

是否存在錯誤或者是否存在另一種可能的方式如何傳遞該成員結構並檢查其Selected屬性?

+0

您無法將列表對象發佈到ActionResult,您可能希望以某種替代方式工作,如FormCollection – HaBo 2013-05-10 21:48:30

+0

@HaBo - 這是不正確的。您可以在ASP.NET MVC中完美地綁定到集合。 – 2013-05-11 02:22:44

+0

@大衛剛剛看到你的答案,我不知道這件事。學到了一些東西。下次會嘗試這個。 – HaBo 2013-05-11 13:27:27

回答

1

與集合的模型綁定工作方式稍有不同。每個項目都必須有一個標識符,這樣輸入的名稱纔不一樣。我已經回答了similar question here

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

...這應該呈現類似...

<input type="text" name="MembersEnum[0].FirstName" value="" /> 
<input type="text" name="MembersEnum[1].FirstName" value="" /> 
<input type="text" name="MembersEnum[2].FirstName" value="" /> 

...然後應該填充集合中由控制器拿起當你的視圖模型......

public ActionResult GoToSendEmail(ViewModels.MembersViewModel model) 

正如在其他答案中提到的,我會看看Scott HanslemanPhil Haack的一些相關文章。

您還提到當您提交給您的POST操作時,您的字符串Testnull。您尚未在表單中的任何位置爲此屬性添加字段,因此模型綁定器無法綁定到該字段。如果您在表單中添加一個字段,那麼你應該看到的價值在POST行動:

@Html.EditorFor(modelItem => modelItem.Test) 
+0

感謝您的回答!它引導我到這篇博客[鏈接](http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/)。描述的Html.BeginCollectionItem()助手非常適合我的需求。它完美無瑕。 – Yuri 2013-05-11 09:23:30

+0

爲一個很好的答案投票 – HaBo 2013-05-11 13:32:01