2012-03-07 41 views
1

我貼我的<input type="submit" value ="submit">它具有以下格式的數據(與螢火選中)獲取數據

Role1 true 
Role1 false 
Role1 true 
Role1 false 
Name1 "Name 1" 
Name2 "Name2" 

,並在我的控制器

[HttpPost] 
public ActionResult GetPostData(ArrayList data) 

的問題我應該在控制器中設置什麼樣的參數,以便能夠獲得某種數據結構,這些數據結構會被post發送的值填滿?我不想使用FormCollection。我可以製作某種PostModel,但所有這些數據都是通過隱藏字段發送的,這些隱藏字段在大多數情況下都是用jquery動態生成的,所以我無法想象如何將postmodel與字段綁定。

回答

4

我猜你的意思(具有role1上四次似乎有點不可思議):

Role1 true 
Role1 false 
Role2 true 
Role2 false 
Name1 "Name 1" 
Name2 "Name2" 

你可以使用一個視圖模型:

public class MyViewModel 
{ 
    public bool Role1 { get; set; } 
    public bool Role2 { get; set; } 
    public string Name1 { get; set; } 
    public string Name2 { get; set; } 
} 

然後:

[HttpPost] 
public ActionResult GetPostData(MyViewModel model) 
{ 
    ... 
} 

因爲我懷疑你正在做複選框的東西(由於每個角色的雙布爾值,因爲CheckBox助手會生成一個hidd EN場),這裏是什麼,我會建議你:

型號:

public class RoleViewModel 
{ 
    public bool IsSelected { get; set; } 
    public string Name { get; set; } 
} 

public class EditRolesViewModel 
{ 
    public RoleViewModel[] Roles { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new EditRolesViewModel 
     { 
      Roles = new[] 
      { 
       new RoleViewModel { Name = "Role 1", IsSelected = true }, 
       new RoleViewModel { Name = "Role 2", IsSelected = false }, 
       new RoleViewModel { Name = "Role 3", IsSelected = true }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(EditRolesViewModel model) 
    { 
     return View(model); 
    } 
} 

查看:

@model EditRolesViewModel 

@using (Html.BeginForm()) 
{ 
    for (int i = 0; i < Model.Roles.Length; i++) 
    { 
     <div> 
      @Html.HiddenFor(x => x.Roles[i].Name) 
      @Html.LabelFor(x => x.Roles[i].IsSelected, Model.Roles[i].Name) 
      @Html.CheckBoxFor(x => x.Roles[i].IsSelected) 
     </div> 
    } 
    <button type="submit">OK</button> 
} 

,甚至更好,使用編輯器模板這將針對每個角色呈現:

@model EditRolesViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Roles) 
    <button type="submit">OK</button> 
} 

和編輯模板(~/Views/Shared/EditorTemplates/RoleViewModel.cshtml):

@model RoleViewModel 

<div> 
    @Html.HiddenFor(x => x.Name) 
    @Html.LabelFor(x => x.IsSelected, Model.Name) 
    @Html.CheckBoxFor(x => x.IsSelected) 
</div> 
+0

好得多的建模,謝謝 – Elena 2012-03-08 10:33:34

+0

好的是,你可以添加一個額外的字段(例如'Id')到你的ViewModel,然後你所需要的就是更新自定義編輯器(添加一個新的隱藏字段。 )甜。 – 2013-09-18 04:07:11

0

像達林建議你應該使用視圖模型。

這樣,您可以將數據從Controller傳遞到View,反之亦然。這在驗證視圖模型時非常方便,可以檢測某種驗證錯誤(例如,值太低),然後將所有數據發送回視圖。

你可以找到關於在客戶端和服務器端之間來回「移動」數據的不同方式的好說明。

Use ViewData and Implement ViewModel Classes

Views and ViewModels

更新

問題可能是在複選框的結合,所以我的鏈接,我加入可能太 「一般」。