Как добавить проверочное сообщение в мой пользовательский HtmlHelper? - PullRequest
1 голос
/ 10 октября 2011

У меня есть класс, в котором я использовал аннотации данных:

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

Я также создал собственный HtmlHelper с именем RadioButtonListFor, который я могу назвать так:

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

MySexList определяется следующим образом:

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 ".Как я могу получить текст, который я указал в моих аннотациях данных?

1 Ответ

1 голос
/ 10 октября 2011

Ах ... нашел решение сам, после хорошего ночного сна: -)

Замена 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", которыйпо-видимому, это словарь моих пунктов проверки.И циклически повторяя их и добавляя их, это работает как шарм!

Отредактировано 13 октября 2011 г .:

Закончено приведенным ниже решением.Вместо того, чтобы просто получить список строк, я решил отправить в Словарь, где ключ - это значение радиокнопки, а значение словаря - текст радиокнопки.

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);
    }
...