2012-11-18 119 views
1

傳遞一個對象與HttpPost時有問題... 一旦提交表單,模型在控制器端設置爲「null」,我不知道在哪裏問題...net mvc4 HttpPost null值

這裏是我的控制器:

public ActionResult AddUser(int id = 0) 
    { 
     Group group = db.Groups.Find(id); 
     List<User> finalList = db.Users.ToList() ; 

     return View(new AddUserTemplate() 
      { 
       group = group, 
       users = finalList 
      }); 
//Everything is fine here, the object is greatly submitted to the view 
    } 



    [HttpPost] 
    public ActionResult AddUser(AddUserTemplate addusertemplate) 
    { 
//Everytime we get in, "addusertemplate" is NULL 
     if (ModelState.IsValid) 
     { 
//the model is null 
     } 
     return View(addusertemplate); 

    } 

這裏是AddUserTemplate.cs:

public class AddUserTemplate 
{ 
    public Group group { get; set; } 
    public User selectedUser { get; set; } 
    public ICollection<User> users { get; set; } 
} 

這裏是一個返回空值到控制器的形式(注意降下拉列表與良好的價值觀大大填充):

@using (Html.BeginForm()) { 
<fieldset> 
    <legend>Add an user</legend> 
    @Html.HiddenFor(model => model.group) 
    @Html.HiddenFor(model => model.users) 
    <div class="editor-field"> 
//Here, we select an user from Model.users list 
     @Html.DropDownListFor(model => model.selectedUser, new SelectList(Model.users)) 
    </div> 
    <p> 
     <input type="submit" value="Add" /> 
    </p> 
</fieldset> 
} 

非常感謝您的幫助

+1

您可以向控制器添加斷點並觀察Request.Form變量中的內容嗎?請展示它。 –

+0

也顯示'User'和'Group'類 – GolfWolf

+0

的代碼是'addusertemplate'對象爲空,或者只是它的屬性? – GolfWolf

回答

2

我想你的代碼,並在我的情況下addusertemplate模型是不是空的,但它的屬性都爲空。

這是因爲幾個模型綁定問題:Html.HiddenForHtml.DropDownListFor不復雜類型(如GroupUser)(至少這是它在默認情況下)工作。

此外,Html.HiddenFor不能處理集合。

這裏是如何解決這些問題:

  • 代替@Html.HiddenFor(model => model.group)應該有一個@Html.HiddenFor您需要通過迭代,你需要綁定

  • ,而不是@Html.HiddenFor(model => model.users)組的每個屬性用戶列表和每個對象添加@Html.HiddenFor您需要綁定的用戶的每個屬性

  • 而不是@Html.DropDownListFor(model => model.selectedUser [...],創建一個像int SelectedUserId {get;set;}這樣的屬性並在DropDownList中使用它(因爲它無法處理複雜類型)。

下面是工作代碼:

UserGroup類,我以爲,他們是:

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Group 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

2。調整後AddUserTemplate類:

public class AddUserTemplate 
{ 
    public Group Group { get; set; } 
    public IList<User> Users { get; set; } 

    public int SelectedUserId { get; set; } 

    public User SelectedUser 
    { 
     get { return Users.Single(u => u.Id == SelectedUserId); } 
    } 
} 

的調整:

  • UsersICollection改爲IList,因爲我們需要通過他們的索引來訪問元素(參見視圖代碼)
  • 添加SelectedUserId屬性,將用於DropDownList
  • SelectedUser不是隻讀屬性,返回當前選擇的User

爲視圖調整後的代碼:

@using (Html.BeginForm()) 
{ 
    <fieldset> 
     <legend>Add an user</legend> 

     @*Hidden elements for the group object*@ 
     @Html.HiddenFor(model => model.Group.Id) 
     @Html.HiddenFor(model => model.Group.Name) 

     @*Hidden elements for each user object in the users IList*@ 
     @for (var i = 0; i < Model.Users.Count; i++) 
    { 
      @Html.HiddenFor(m => m.Users[i].Id) 
      @Html.HiddenFor(m => m.Users[i].Name) 
    } 
     <div class="editor-field"> 
      @*Here, we select an user from Model.users list*@ 
      @Html.DropDownListFor(model => model.SelectedUserId, new SelectList(Model.Users, "Id", "Name")) 
     </div> 
     <p> 
      <input type="submit" value="Add" /> 
     </p> 
    </fieldset> 
} 
+0

太棒了!非常感謝w0lf – Tang

0

不需要一堆隱藏字段是簡單地指定要傳遞給控制器​​模型的另一個選擇。我認爲這更清潔。

@using(Html. BeginForm("action","controller", Model, FormMethod.Post)){ 
... 
}