如何基于复选框从视图传递对象
本文关键字:对象 视图 何基于 复选框 | 更新日期: 2023-09-27 17:59:39
我想知道是否可以根据复选框选择传递对象。我会解释自己:如果有一个选定的值,那真的意味着我需要传递该选定代表的对象才能使用它
我有这样的代码在我的看法:
<% foreach (var _client in ViewData["channels"] as List<DigiTV.Models.CANAL>) { %>
<%= Html.CheckBox(_client.NOM_CANAL) %> <%= Html.Encode(_client.NOM_CANAL) %> <br />
<% } %>
正如你所看到的,我有一个对象类型的列表,我想传递给控制器(列表)
有人有什么建议吗?
感谢
我强烈建议您使用视图模型、强类型视图和编辑器模板。
因此,始终从定义一个视图模型开始,该模型将包含视图可能需要的所有必要数据:
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
循环。所有的事情都由遵循既定惯例的框架自动处理。
您可以通过在隐藏字段中收集所有选中的复选框值(逗号分隔)来使用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(",");
}