我要做的是创建一个html扩展方法,在mvc项目中构建一组单选按钮。我知道我可以写一个for循环但这对于在其他项目中重用是一个非常有用的方法,所以我想弄清楚这一点。
我想要做的是能够传递单选按钮所用的模型属性的表达式(所以我可以将单选按钮命名为相同的东西并选择所选的选项),这是一组对象选项,以及要用作单选按钮值的选项对象的属性。
这是我到目前为止所做的,但它不起作用。 (我得到错误“无法将方法组'值'转换为非委托类型'字符串'。您打算调用该方法吗?”)。
public static HtmlString RadioOptionsFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> modelExpression,
IEnumerable<object> radioOptions,
Expression<Func<object, string>> valueExpression)
{
StringBuilder sb = new StringBuilder();
var propertyName = ((MemberExpression)(modelExpression.Body)).Member.Name;
radioOptions.Select(el => sb.Append(htmlHelper.RadioButton(propertyName, valueExpression.Compile()(el))));
return new HtmlString(sb.ToString());
}
@Html.RadioOptionsFor(x => x.Category, Model.CategoryOptions, e => e.Value)
更新: 好吧,StriplingWarrior帮我找到了一个有效的解决方案。问题是将第二个表达式函数的参数声明为对象。它应该是泛型类型,所以我只需要更改方法声明。我还添加了一个辅助方法来构建一个带有包装标签元素的单选按钮。我也做了一些linq stringbuilding,所以我不必两次遍历集合。最后,我添加了选择模型的当前值并删除单选按钮元素的重复ID。这是最终的解决方案。
public static string RadioButtonWithLabel<TModel>(this HtmlHelper<TModel> htmlHelper, string name, string value, string selectedValue)
{
var sb = new StringBuilder();
sb.Append("<label for=\"").Append(name).AppendLine("\">")
.AppendLine(htmlHelper.RadioButton(name, value, selectedValue.Equals(value), new { id = "" }).ToString())
.Append(value).AppendLine("</label>");
return sb.ToString();
}
public static HtmlString RadioOptionsFor<TModel, TProperty, TElement>(this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> modelExpression,
string selectedValue,
IEnumerable<TElement> radioOptions,
Expression<Func<TElement, string>> valueExpression)
{
var propertyName = ((MemberExpression)(modelExpression.Body)).Member.Name;
var result = radioOptions.Aggregate(new StringBuilder(), (sb, el) => sb.Append(htmlHelper.RadioButtonWithLabel(propertyName, valueExpression.Compile()(el), selectedValue)));
return new HtmlString(result.ToString());
}
像这样打电话
@Html.RadioOptionsFor(x => x.Category, Model.Category, Model.CategoryOptions, e => e.Value)
答案 0 :(得分:0)
Expression<Func<object, string>> valueExpression
希望你的表达式产生一个字符串:e.Value
的类型是什么?
似乎e.Value
不应该存在,因为e
是一个对象。这是一种扩展方法吗?如果是这样,你可能需要通过:
e => e.Value()
因此,解读您的错误消息:它无法转换&#34;价值&#34; (这是方法或委托)到表达式所期望的string
:您是否打算调用该方法来生成字符串?