如何基于复选框从视图中传递对象?

3

我想知道是否可以根据复选框的选择传递一个对象。我来解释一下:如果有一个选定的值,那么这实际上意味着我需要传递表示所选内容的对象以便使用它。

我在视图中有以下代码:

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

正如您所见,我有一个要传递给控制器的对象类型列表(List)

有人有什么建议吗?

谢谢

2个回答

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(",");
  } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接