2011-06-19 30 views
3

我想知道是否有可能通過基於複選框選擇的對象。我解釋自己:如果有一個選定的值,這實際上意味着我需要傳遞選擇代表的對象才能使用它。如何根據複選框從視圖中傳遞對象?

我有這樣的代碼在我看來:

<% foreach (var _client in ViewData["channels"] as List<DigiTV.Models.CANAL>) { %> 
    <%= Html.CheckBox(_client.NOM_CANAL) %> <%= Html.Encode(_client.NOM_CANAL) %> <br /> 
<% } %> 

正如你所看到的,我有對象類型的列表,我想傳遞給控制器​​(列表)

難道有人有什麼建議麼?

感謝

回答

1

我會強烈建議您使用視圖模型,強類型的意見和編輯模板。

,以便始終通過定義將包含所有必要的數據視圖模型開始你的觀點可能需要:

public class CanalViewModel 
{ 
    public string Name { get; set; } 
    public bool Selected { get; set; } 
} 

然後控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new[] 
     { 
      new CanalViewModel { Name = "canal 1", Selected = false }, 
      new CanalViewModel { Name = "canal 2", Selected = true }, 
      new CanalViewModel { Name = "canal 3", Selected = false }, 
      new CanalViewModel { Name = "canal 4", Selected = false }, 
     }; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(IEnumerable<CanalViewModel> model) 
    { 
     return View(model); 
    } 
} 

和接下來是~/Views/Home/Index.aspx觀點:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.CanalViewModel>>" 
%> 

<% using (Html.BeginForm()) { %> 
    <%= Html.EditorForModel() %> 
    <input type="submit" value="OK" /> 
<% } %> 

最後你需要一個運河的編輯模板這將爲模型中的每個元素(~/Views/Home/EditorTemplates/CanalViewModel.ascx)執行:

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.CanalViewModel>" 
%> 

<div> 
    <%= Html.HiddenFor(x => x.Name) %> 
    <%= Html.CheckBoxFor(x => x.Selected) %> 
    <%= Html.LabelFor(x => x.Selected, Model.Name) %> 
</div> 

現在,當您提交表單,POST操作裏面,你會得到所有運河的列表以及它們選定的屬性存在,這取決於複選框沿用戶選擇。

正如你所看到的,我們不需要任何ViewData,它需要你在你的視圖中執行一些醜陋的強制轉換,而且你不需要在視圖中編寫任何foreach循環。一切都由框架按照既定的慣例自動處理。

0

您可以使用javascript通過在隱藏字段中收集所有選中的複選框值(逗號分隔),然後從您的控制器讀取這些值並對其進行分割。

<% foreach (var _client in ViewData["channels"] as List<DigiTV.Models.CANAL>) { %> 
<%= Html.CheckBox(_client.NOM_CANAL) %> <%= Html.Encode(_client.NOM_CANAL) %> <br /> 
<% } %> 
<%=Html.HiddenField("AllValues")%> 

的JavaScript(我使用jQuery)

var allvalues=''; 
    $('input[type=checkbox]').each(function(index){ 
     if($(this).is(':checked')) 
     { 
      allvalues+=$(this).val(); 
     } 
    }); 
    $('#AllValues').val(allvalues); 

在你控制器

public ActionResult MyAction(FormCollection form) 
    { 
    String[] AllValues = form["AllValues"].Split(","); 
    } 
相關問題