我想知道是否可以根据复选框选择来传递对象。我自己解释一下:如果有一个选定的值,那实际上意味着我需要传递该选择代表的对象才能使用它。
我有这段代码:
<% foreach (var _client in ViewData["channels"] as List<DigiTV.Models.CANAL>) { %>
<%= Html.CheckBox(_client.NOM_CANAL) %> <%= Html.Encode(_client.NOM_CANAL) %> <br />
<% } %>
如您所见,我有一个要传递给 Controller 的对象类型列表(List)
有人有什么建议吗?
谢谢
最佳答案
我强烈建议您使用 View 模型、强类型 View 和编辑器模板。
因此,一如既往地从定义一个 View 模型开始,它将包含您的 View 可能需要的所有必要数据:
public class CanalViewModel
{
public string Name { get; set; }
public bool Selected { get; set; }
}
然后是一个 Controller :
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
View :
<%@ 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,这将要求您在 View 中执行一些丑陋的转换,并且您不需要在 View 中编写任何 foreach
循环。一切都由框架按照既定的约定自动处理。
关于c# - 如何从基于复选框的 View 传递对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6401277/