繁体   English   中英

ASP.net MVC RC2 - 具有显式值的复选框

[英]ASP.net MVC RC2 - Checkboxes with explicit values

是否有一种简单的方法可以使用现有的 Html 助手生成具有显式值的复选框列表(在 Beta 中可能)?

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

.CheckBox("Field", 6, new { value = 6})将 output:

<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 id并在适当时设置检查的 HTML 属性

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

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

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

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

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

private static string CheckBoxWithValue(this HtmlHelper htmlHelper, string name, object value, bool isChecked, bool setId, IDictionary htmlAttributes)
        {
            const InputType inputType = InputType.CheckBox;
            if (String.IsNullOrEmpty(name))
            {
                throw new ArgumentException("null or empty error", "name");
            }

            var tagBuilder = new TagBuilder("input");
            tagBuilder.MergeAttributes(htmlAttributes);
            tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType));
            tagBuilder.MergeAttribute("name", name, true);
            string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture);

            if (isChecked)
            {
                tagBuilder.MergeAttribute("checked", "checked");
            }
            tagBuilder.MergeAttribute("value", valueParameter, true);
            if (setId) tagBuilder.GenerateId(name);

            // If there are any errors for a named field, we add the css attribute.
            ModelState modelState;
            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("type", HtmlHelper.GetInputTypeString(InputType.Hidden));
            hiddenInput.MergeAttribute("name", name);
            if (setId)
            {
                hiddenInput.GenerateId(name);
            }
            hiddenInput.MergeAttribute("value", valueParameter);

            inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing));
            return inputItemBuilder.ToString();

        }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM