我有一个使用数据注释的类:
[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”中硬编码了“Missing”这个词。如何获取我在数据注释中说明的文本?
答案 0 :(得分: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日编辑:
结束以下解决方案。我决定发送一个字典,其中键是radiobutton值而字典的值是radiobutton文本。而不是仅仅获取字符串列表。
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);
}