我想为dropdownlist创建一个自定义htmlhelper(扩展方法),以接受selectlistitem的Option标记中的自定义属性。
我的模型类中有一个属性,我想在选择列表的选项标签中包含一个属性。
即<option value ="" modelproperty =""></option>
我遇到了各种各样的例子,但对我想要的东西并不十分具体。
答案 0 :(得分:4)
试试这个:
public static MvcHtmlString CustomDropdown<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
IEnumerable<SelectListItem> listOfValues,
string classPropName)
{
var model = htmlHelper.ViewData.Model;
var metaData = ModelMetadata
.FromLambdaExpression(expression, htmlHelper.ViewData);
var tb = new TagBuilder("select");
if (listOfValues != null)
{
tb.MergeAttribute("id", metaData.PropertyName);
var prop = model
.GetType()
.GetProperties()
.FirstOrDefault(x => x.Name == classPropName);
foreach (var item in listOfValues)
{
var option = new TagBuilder("option");
option.MergeAttribute("value", item.Value);
option.InnerHtml = item.Text;
if (prop != null)
{
// if the prop's value cannot be converted to string
// then this will throw a run-time exception
// so you better handle this, put inside a try-catch
option.MergeAttribute(classPropName,
(string)prop.GetValue(model));
}
tb.InnerHtml += option.ToString();
}
}
return MvcHtmlString.Create(tb.ToString());
}
答案 1 :(得分:0)
是的,你可以自己创造它。 创建一个Extension方法,该方法将接受包含所有必需属性的Object列表。使用TagBuilder创建标签并使用它的MergeAttribute方法向其添加自己的属性。 干杯