【问题标题】:ASP.net MVC RC2 - Checkboxes with explicit valuesASP.net MVC RC2 - 具有显式值的复选框
【发布时间】:2009-03-09 16:07:16
【问题描述】:

有没有一种简单的方法来使用现有的 Html Helpers 来生成具有明确值的复选框列表(在 Beta 中可以实现)?

Beta 中的示例(可能使用 MVC Contrib):

.CheckBox("Field", 6, new { value = 6}) 会输出:

<input id="Field1" type="checkbox" value="6" name="Field" />
<input id="Field2" type="hidden" value="6" name="Field" />

但在 RC2 中我得到:

<input id="Field1" type="checkbox" value="6" name="Field" />
<input type="hidden" value="false" name="Field" />

注意:我使用自定义助手扩展 生成唯一的 HTML ids 和 设置选中的 HTML 属性时 合适的

除了使用原始 HTML 而不是使用 Html Helpers 之外,还有一种设置复选框的方法 有明确的价值观?查看 RC2 的 Codeplex 源代码似乎不是一个简单的方法,因为 .InputHelper() 被标记为 private,因此您无法使用它来提供帮助。

注意:页面中有多个 checkbox 以允许多选,因此 false 值没有用,因为我需要隐藏字段中的值来知道哪些项目被勾选,哪些项目没有被勾选t(因为未发布未检查的 checkbox 值 - 只有隐藏字段)。

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc


    【解决方案1】:

    如果该字段映射到的属性是 Int 类型,那么我认为 false 将被转换为 0。

    这就是您知道该框是否被选中的方式。

    【讨论】:

      【解决方案2】:

      作为一种解决方法,我大致基于 RC2 源代码的 InputHelper 方法提出了以下方法,但对其进行了调整以允许多个值:

      private static string CheckBoxWithValue(this HtmlHelper htmlHelper, string name, object value, bool isChecked, bool setId, IDictionary htmlAttributes) { 常量 InputType inputType = InputType.CheckBox; if (String.IsNullOrEmpty(name)) { throw new ArgumentException("null or empty error", "name"); } var tagBuilder = new TagBuilder("输入"); tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("类型", HtmlHelper.GetInputTypeString(inputType)); tagBuilder.MergeAttribute("name", name, true); string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture); 如果(已检查) { tagBuilder.MergeAttribute("checked", "checked"); } tagBuilder.MergeAttribute("value", valueParameter, true); if (setId) tagBuilder.GenerateId(name); // 如果命名字段有任何错误,我们添加 css 属性。 模型状态模型状态; if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } var inputItemBuilder = new StringBuilder(); inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing)); var hiddenInput = new TagBuilder("input"); hiddenInput.MergeAttributes(htmlAttributes); hiddenInput.MergeAttribute("类型", HtmlHelper.GetInputTypeString(InputType.Hidden)); hiddenInput.MergeAttribute("name", name); 如果 (setId) { hiddenInput.GenerateId(name); } hiddenInput.MergeAttribute("value", valueParameter); inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing)); 返回 inputItemBuilder.ToString(); }

      这依赖于 .ToString() 您评估对象的值,但对于我使用整数表示选项并在后端数据库中完成查找的场景来说已经足够了。请注意,setId 布尔值似乎只是用下划线字符替换 Html 名称中的点。在 HTML 中使用多个复选框时,ID 应该是唯一的,因此我只需通过 htmlAttributes 集合传入唯一的 Id。

      【讨论】:

      • 我已经将它包装在另一个公共辅助方法中,以从 modelstate/viewdata 设置 isChecked 值,以防您想知道为什么它被标记为私有。
      【解决方案3】:

      如果您最近从“普通”的 ASP.Net 开始使用 MVC,那么您可能非常希望避免直接输入 HTML,但在 MVC 世界中这不是什么大问题,因为不再有任何要处理的观点和其他问题。因此,如果您愿意,请随意使用直接 HTML,特别是如果您只处理整数(不必担心 javascript 注入或任何事情)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 2011-01-05
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多