MVC2复选框:仍有问题;或者:选择与它有什么关系?

时间:2010-11-11 17:26:49

标签: asp.net-mvc-2 checkbox

在我的创建和编辑表单越来越多的史诗般的失败中,我仍然遇到通过Html.Checkbox()生成复选框的问题。我不确定此时是否应该手动编写HTML。

我有一个视图模型:

public class AdminGameReviewViewModel
{
    public Game GameData { get; set; }
    public List<Genre> AllGenres { get; set; }
    public List<PlatformListing> AllPlatforms { get; set; }
}

辅助模型:

public class PlatformListing
{
    public Platform Platform { get; set; }
    public bool IsSelected { get; set; }
}

并且,我正在尝试生成如下所示的复选框:

<%: Html.Label("Platforms") %><br />
<% Model.AllPlatforms.ForEach(p => Html.Encode(Html.CheckBox("PlatformIDs", p.IsSelected, new { value = p.Platform.PlatformID }))); %>

但是,他们根本没有展示。

我很好奇为什么我需要为复选框本身提供一个布尔值。我认为它只会发送回检查值,作为类似于PHP的$ _POST的数组或列表。所以,我不确定我是否正确实现了我的布尔属性,除了我正在提交的任何其他脑死亡错误。布尔值迫使我埋葬我想要显示/绑定的数据比我想要的更多,而且它让我“看到”我做错了什么。

我一直觉得我对我的问题看得太深了,并试图让解决方案变得更加复杂。鉴于我对MVC2 / C#的经验不足,我只是不确定从哪里开始。这似乎是表单处理的一部分,无论是大多数演示和教程都被掩盖或完全忽略,这无济于事。

所以,再次,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

问题是你没有在Response流中写任何内容。

Html.Checkbox()返回一个字符串,它不直接写入响应对象(Html.Encode() - 也只是转义保留字符并返回结果字符串)。最重要的是,ForEach扩展方法只执行一个动作,它不返回值。

所以你必须放弃ForEach扩展,并使用&lt;%=%&gt;或&lt;%:%&gt;代码块:

<% foreach (var p in Model.AllPlatforms) { %>
   <%= Html.CheckBox("PlatformIDs", p.IsSelected, new { value = p.Platform.PlatformID }) %>
<% } %>