您最好的选择是搜索更新的问题,或搜索下面的答案,寻找您的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 更新的.
但我没有为此设置对象; 这是否意味着这是唯一的方法?还有另一种方法吗?
我有一个名为"PropertyFeature"的类,它只包含PropertyFeatureID和Description.它是通过映射到SQL Server数据库表的LINQ to SQL创建的正确模型.示例实例/行将是:
PropertyFeatureID: 2
Description: "Swimming Pool"
Run Code Online (Sandbox Code Playgroud)
行数(PropertyFeatures)当然可以增长和缩小,因此我想动态呈现一个复选框列表,以便用户可以选择其中任何一个.我可以很容易地动态渲染Checkbox,例如:
<%foreach (var Feature in (ViewData["Features"] as IEnumerable<MySolution.Models.PropertyFeature>)) { %>
<%=Html.CheckBox("Features", new { @id = Feature.PropertyFeatureID, @value = Feature.PropertyFeatureID })%><label for="Feature<%=Feature.PropertyFeatureID%>"><%=Feature.Description%></label>
<%}%>
Run Code Online (Sandbox Code Playgroud)
我为每个复选框指定ID并呈现匹配的标签,以便用户可以直观地单击标签并切换复选框 - 这很有效.
我将CheckBox的"名称"设置为"Features",因此所有复选框都以相同的名称呈现,并且MVC Model Binder在发布表单时将它们堆叠到一个名为"Features"的集合中.这很好用.
提交表单后,我使用选中的值并存储它们,因此我需要实际的整数值,因此我知道选择了哪个PropertyFeature,而不仅仅是一堆布尔值和字段名称.理想情况下,我希望它可以作为一个易于使用的数组或集合.
单击按钮时,我可以从Controller方法中检索所选值,因为我已将参数指定为int [] Features.
但问题是它没有维持状态.也就是说,当我单击提交按钮并重新加载页面(再次显示该表单)时,我希望所有动态复选框保持其已检查状态(或不保持).所有这一切我已经创造了其他领域Html.DropDownList,并Html.TextBox都保持自己的状态没有任何成功都在同一页上以相同的形式问题.
我花了几个小时阅读关于类似问题的所有其他线程和文章,并且有很多关于使用ICollection和IDictionary捆绑的内容,并为每个项目包含一个布尔值,以便它可以保持复选框状态.但我并没有100%掌握如何在我个人的例子中使用它.我想保持解决方案非常简单,不必为了保持我的复选框状态而编写新类的页面.
这样做最干净,最恰当的方法是什么?