247 forms checkbox asp.net-mvc
您最好的选择是搜索更新的问题,或搜索下面的答案,寻找您的MVC的特定版本,因为现在许多答案已经过时.
如果您确实找到适合您的版本的答案,请确保答案包含您正在使用的MVC版本.
(原始问题从下面开始)
这对我来说似乎有点奇怪,但就我所知,这就是你如何做到的.
我有一组对象,我希望用户选择其中一个或多个.这对我说"形式有复选框".我的对象没有任何"选择"的概念(它们是通过反序列化wcf调用形成的基本POCO).所以,我做了以下事情:
public class SampleObject{
public Guid Id {get;set;}
public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
在视图中:
<%
using (Html.BeginForm())
{
%>
<%foreach (var o in ViewData.Model) {%>
<%=Html.CheckBox(o.Id)%> <%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
Run Code Online (Sandbox Code Playgroud)
并且,在控制器中,这是我可以看到用来检查用户检查的对象的唯一方法:
public ActionResult ThisLooksWeird(FormCollection result)
{
var winnars = from x in result.AllKeys
where result[x] != "false"
select x;
// yadda
}
Run Code Online (Sandbox Code Playgroud)
它首先是怪异的,其次,对于用户检查的那些项,FormCollection将其值列为"真假"而不仅仅是真.
显然,我错过了一些东西.我认为这是基于这样的想法构建的,即在html表单中作用的集合中的对象是使用UpdateModel()
或通过ModelBinder 更新的.
但我没有为此设置对象; 这是否意味着这是唯一的方法?还有另一种方法吗?
Dyl*_*tie 262
Html.CheckBox正在做一些奇怪的事情 - 如果你在结果页面上查看源代码,你会看到<input type="hidden" />
每个复选框旁边都有一个生成,这解释了你在每个表单元素中看到的"真假"值.
试试这个,这肯定适用于ASP.NET MVC Beta,因为我刚试过它.
把它放在视图中而不是使用Html.CheckBox():
<% using (Html.BeginForm("ShowData", "Home")) { %>
<% foreach (var o in ViewData.Model) { %>
<input type="checkbox" name="selectedObjects" value="<%=o.Id%>">
<%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
Run Code Online (Sandbox Code Playgroud)
您的复选框全部被调用selectedObjects
,value
每个复选框的复选框都是相应对象的GUID.
然后发布到以下控制器操作(或类似的东西,做一些有用的而不是Response.Write())
public ActionResult ShowData(Guid[] selectedObjects) {
foreach (Guid guid in selectedObjects) {
Response.Write(guid.ToString());
}
Response.End();
return (new EmptyResult());
}
Run Code Online (Sandbox Code Playgroud)
这个例子只会写你检查的框的GUID; ASP.NET MVC将所选复选框的GUID值映射到Guid[] selectedObjects
您的参数中,甚至将Request.Form集合中的字符串解析为即时GUID对象,我认为这些对象相当不错.
And*_*cci 95
HtmlHelper添加一个隐藏的输入来通知控制器有关未经检查的状态.所以要有正确的检查状态:
bool bChecked = form[key].Contains("true");
Run Code Online (Sandbox Code Playgroud)
Sim*_*ver 54
如果您想知道为什么他们使用与复选框相同的名称放置隐藏字段,原因如下:
来自源代码MVCBetaSource\MVC\src\MvcFutures\Mvc\ButtonsAndLinkExtensions.cs的评论
<input type="hidden".../>
为复选框添加附加内容.这解决了未在请求中发送未选中复选框的情况.发送隐藏的输入可以在提交请求时知道页面上存在复选框.
我想在幕后他们需要知道这个用于绑定控制器动作方法上的参数.然后,我可以使用三态布尔值(绑定到可以为空的bool参数).我没试过,但我希望他们做了什么.
Sim*_*ver 49
您也应该使用,<label for="checkbox1">Checkbox 1</label>
因为人们可以点击标签文本以及复选框本身.它也更容易风格,至少在IE中,当你浏览页面的控件时它会突出显示.
<%= Html.CheckBox("cbNewColors", true) %><label for="cbNewColors">New colors</label>
Run Code Online (Sandbox Code Playgroud)
这不仅仅是'哦,我能做到'的事情.它是一项重要的用户体验增强.即使并非所有用户都知道他们可以点击许多标签.
Sha*_*ean 27
我很惊讶这些答案都没有使用内置的MVC功能.
我在这里写了一篇关于此的博客文章,甚至实际上将标签链接到复选框.我使用EditorTemplate文件夹以干净和模块化的方式完成此任务.
您将在EditorTemplate文件夹中最终得到一个新文件,如下所示:
@model SampleObject
@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)
Run Code Online (Sandbox Code Playgroud)
在你的实际视图中,没有必要循环这个,只需1行代码:
@Html.EditorFor(x => ViewData.Model)
Run Code Online (Sandbox Code Playgroud)
访问我的博客文章了解更多详情.
mma*_*lay 25
这就是我一直在做的事情.
视图:
<input type="checkbox" name="applyChanges" />
控制器:
var checkBox = Request.Form["applyChanges"];
if (checkBox == "on")
{
...
}
我发现Html.*帮助器方法在某些情况下并没有那么有用,而且我最好在普通的旧HTML中使用它.这是其中之一,想到的另一个是单选按钮.
编辑:这是在预览5上,显然是版本之间的YMMV.
小智 10
它们似乎只选择读取第一个值,因此选中复选框时为"true",而仅包含隐藏值时为"false".这很容易用这样的代码获取:
model.Property = collection["ElementId"].ToLower().StartsWith("true");
Run Code Online (Sandbox Code Playgroud)
小智 8
@Dylan Beattie很棒的发现!!! 我非常感谢你 为了进一步扩展,这种技术也适用于View Model方法.MVC非常酷,它足够聪明,可以通过绑定到View的Model对象的相同名称将Guids数组绑定到属性.例:
视图模型:
public class SampleViewModel
{
public IList<SampleObject> SampleObjectList { get; set; }
public Guid[] SelectedObjectIds { get; set; }
public class SampleObject
{
public Guid Id { get; set; }
public string Name { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
视图:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Sample View</h2>
<table>
<thead>
<tr>
<th>Checked</th>
<th>Object Name</th>
</tr>
</thead>
<% using (Html.BeginForm()) %>
<%{%>
<tbody>
<% foreach (var item in Model.SampleObjectList)
{ %>
<tr>
<td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
<td><%= Html.Encode(item.Name)%></td>
</tr>
<% } %>
</tbody>
</table>
<input type="submit" value="Submit" />
<%}%>
Run Code Online (Sandbox Code Playgroud)
控制器:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult SampleView(Guid id)
{
//Object to pass any input objects to the View Model Builder
BuilderIO viewModelBuilderInput = new BuilderIO();
//The View Model Builder is a conglomerate of repositories and methods used to Construct a View Model out of Business Objects
SampleViewModel viewModel = sampleViewModelBuilder.Build(viewModelBuilderInput);
return View("SampleView", viewModel);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SampleView(SampleViewModel viewModel)
{
// The array of Guids successfully bound to the SelectedObjectIds property of the View Model!
return View();
}
Run Code Online (Sandbox Code Playgroud)
任何熟悉View Model理念的人都会高兴,这就像冠军!
我还想指出,您可以为每个复选框命名一个不同的名称,并将该名称作为actionresults参数的一部分.
例,
视图:
<%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232
<%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422
Run Code Online (Sandbox Code Playgroud)
控制器:
public ActionResults MyAction(bool Rs232CheckBox, bool Rs422CheckBox) {
...
}
Run Code Online (Sandbox Code Playgroud)
由于名称相同,视图中的值将传递给操作.
我知道这个解决方案并不适合你的项目,但我想我会把这个想法抛在脑后.
<input type = "checkbox" name = "checkbox1" /> <label> Check to say hi.</label>
Run Code Online (Sandbox Code Playgroud)
来自控制器:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection fc)
{
var s = fc["checkbox1"];
if (s == "on")
{
string x = "Hi";
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
233367 次 |
最近记录: |