【问题标题】:How do I add a validationmessage to my custom HtmlHelper?如何向我的自定义 HtmlHelper 添加验证消息?
【发布时间】:2011-10-09 23:04:49
【问题描述】:

我有一个使用数据注释的类:

[Required(ErrorMessage = "You must indicate which sex you are.)]
public string Sex { get; set; }

我还创建了一个名为 RadioButtonListFor 的自定义 HtmlHelper,我可以这样调用它:

@Html.RadioButtonListFor(m => m.Sex, "SexList")

我的 SexList 是这样定义的:

IList<string> SexList = new List() { "Male", "Female"};

下面是 RadioButtonListFor 扩展(尚未完全完成):

public static class RadioButtonListForExtentions
{
    public static IHtmlString RadioButtonListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string list)
    {
        string prefix = ExpressionHelper.GetExpressionText(expression);
        if (string.IsNullOrEmpty(prefix))
            prefix = "empty";
        int index = 0;

        var items = helper.ViewData.Eval(list) as IEnumerable;
        if (items == null)
            throw new NullReferenceException("Cannot find " + list + "in view data");

        string txt = string.Empty;
        foreach (var item in items)
        {
            string id = string.Format("{0}_{1}", prefix, index++).Replace('.','_');
            TagBuilder tag = new TagBuilder("input"); 
            tag.MergeAttribute("type", "radio");
            tag.MergeAttribute("name", prefix);
            tag.MergeAttribute("id", id);
            tag.MergeAttribute("data-val-required", "Missing");
            tag.MergeAttribute("data-val", "true");

            txt += tag.ToString(TagRenderMode.Normal);
            txt += item;
        }

        return helper.Raw(txt);
    }
}

我的问题是:现在我在属性“data-val-required”中硬编码了“缺失”这个词。如何获取我在数据注释中声明的文本?

【问题讨论】:

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


    【解决方案1】:

    啊...自己找到了解决方案,经过一夜好眠 :-)

    将 RadioButtonListFor 替换为以下内容:

    public static IHtmlString RadioButtonListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string list)
        {
            string prefix = ExpressionHelper.GetExpressionText(expression);
            if (string.IsNullOrEmpty(prefix))
                prefix = "empty";
            int index = 0;
    
            var items = helper.ViewData.Eval(list) as IEnumerable;
            if (items == null)
                throw new NullReferenceException("Cannot find " + list + "in view data");
    
            var validationAttributes = helper.GetUnobtrusiveValidationAttributes(prefix);
    
            string txt = string.Empty;
            foreach (var item in items)
            {
                string id = string.Format("{0}_{1}", prefix, index++).Replace('.','_');
                TagBuilder tag = new TagBuilder("input"); 
                tag.MergeAttribute("type", "radio");
                tag.MergeAttribute("name", prefix);
                tag.MergeAttribute("id", id);
                foreach (KeyValuePair<string, object> pair in validationAttributes)
                {
                    tag.MergeAttribute(pair.Key, pair.Value.ToString());
                }
                txt += tag.ToString(TagRenderMode.Normal);
                txt += item;
            }
    
            return helper.Raw(txt);
        }
    

    基本上我已经添加了“validationAttributes”,它显然是我的验证项目的字典。循环遍历这些并添加它们使它像魅力一样工作!

    2011 年 10 月 13 日编辑:

    最终得到以下解决方案。我决定发送一个字典,而不是仅仅获取一个字符串列表,其中键是单选按钮的值,字典的值是单选按钮的文本。

    public static IHtmlString RadioButtonListFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string list)
        {
            string prefix = ExpressionHelper.GetExpressionText(expression);
            if (string.IsNullOrEmpty(prefix))
                prefix = "empty";
    
            // find existing value - if any
            string value = helper.ViewData.Eval(prefix) as string;
    
            var validationAttributes = helper.GetUnobtrusiveValidationAttributes(prefix);
            string txt = string.Empty;
    
            // create hidden field for error msg/value
            TagBuilder tagHidden = new TagBuilder("input");
            tagHidden.MergeAttribute("type", "hidden");
            tagHidden.MergeAttribute("name", prefix);
            tagHidden.MergeAttribute("value", value);
            tagHidden.MergeAttribute("id", prefix.Replace('.', '_'));
            foreach (KeyValuePair<string, object> pair in validationAttributes)
            {
                tagHidden.MergeAttribute(pair.Key, pair.Value.ToString());
            }
            txt += tagHidden.ToString(TagRenderMode.Normal);
    
            // prepare to loop through items
            int index = 0;
            var items = helper.ViewData.Eval(list) as IDictionary<string, string>;
            if (items == null)
                throw new NullReferenceException("Cannot find " + list + "in view data");
    
            // create a radiobutton for each item. "Items" is a dictionary where the key contains the radiobutton value and the value contains the Radiobutton text/label
            foreach (var item in items)
            {
                string id = string.Format("{0}_{1}", prefix, index++).Replace('.','_');
                TagBuilder tag = new TagBuilder("input"); 
                tag.MergeAttribute("type", "radio");
                tag.MergeAttribute("name", prefix);
                tag.MergeAttribute("id", id);
                tag.MergeAttribute("value", item.Key);
                if (item.Key == value)
                    tag.MergeAttribute("checked", "true");
                tag.MergeAttribute("onclick", "javascript:" + tagHidden.Attributes["id"] + ".value='" + item.Key + "'");
                txt += tag.ToString(TagRenderMode.Normal);
                txt += item.Value;
            }
    
            return helper.Raw(txt);
        }
    

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 2017-01-08
      • 2022-11-21
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多