使用HtmlHelper为ASP.NET MVC3扩展CheckBoxList
扩展
public static IEnumerable<KeyValuePair<string, MvcHtmlString>> CheckBoxListFor<TModel, TProperty>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> selectedItemsExpression,
ICollection<string> allItems,
IDictionary<string, object> htmlAttributes = null)
{
var selectedItems = (ICollection<string>)typeof(TModel).GetProperty(ExpressionHelper.GetExpressionText(selectedItemsExpression)).GetValue(html.ViewData.Model);
foreach (var item in allItems)
{
var tag = new TagBuilder("input");
tag.MergeAttribute("type", "checkbox");
tag.MergeAttribute("name", ExpressionHelper.GetExpressionText(selectedItemsExpression));
tag.MergeAttribute("value", item);
if (selectedItems.Contains(item))
tag.MergeAttribute("checked", "checked");
tag.MergeAttributes(htmlAttributes);
yield return new KeyValuePair<string, MvcHtmlString>(item, new MvcHtmlString(tag.ToString()));
}
}
使用
数据模型
/// <summary>
/// 参数
/// </summary>
public class Parameters
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Editable(false)]
[ScaffoldColumn(false)]
[Display(Name = "标识")]
public int Id { get; set; }
[Display(Name = "总标题")]
[ViewBlock]
public string 总标题 { get; set; }
[Display(Name = "页眉")]
[ViewBlock]
public string 页眉 { get; set; }
[Display(Name = "页脚")]
[ViewBlock]
public string 页脚 { get; set; }
[Display(Name = "产品类别")]
[ViewBlock]
public string 产品类别 { get; set; }
[Display(Name = "产品")]
[ViewBlock]
public string 产品 { get; set; }
[Display(Name = "新闻")]
[ViewBlock]
public string 新闻 { get; set; }
}
/// <summary>
/// 用于显示可作为显示块
/// </summary>
public class ViewBlockAttribute : Attribute
{ }
/// <summary>
/// 显示块
/// </summary>
public class ViewBlock
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Editable(false)]
[ScaffoldColumn(false)]
[Display(Name = "标识")]
public int Id { get; set; }
[Display(Name = "标题")]
public string Title { get; set; }
[Display(Name = "内容")]
public string Content { get; set; }
[Display(Name = "索引")]
public int Index { get; set; }
[Display(Name = "是否作为主导航菜单项")]
public bool AsMainMenuItem { get; set; }
[Display(Name = "说明")]
public string Comment { get; set; }
[Display(Name = "子显示块")]
public virtual ICollection<ViewBlock> ViewBlocks { get; set; }
[Display(Name = "参数", Description = "可以将参数作为内容的一部分。通过分隔符来分隔各个元素")]
[ScaffoldColumn(false)]
public string Parameters { get; set; }
[Display(Name = "参数", Description = "可以将参数作为内容的一部分。通过分隔符来分隔各个元素")]
[ScaffoldColumn(false)]
public List<string> FormatedParameters
{
get { return (Parameters == null) ? null : Parameters.Split(new[] { Properties.Resources.分隔符 }, StringSplitOptions.RemoveEmptyEntries).ToList(); }
set { Parameters = (value == null) ? null : value.Aggregate("", (b, r) => b + Properties.Resources.分隔符 + r); }
}
/// <summary>
/// 可选的参数值
/// </summary>
public List<string> ParameterItems
{
get
{
return typeof(Parameters).GetProperties()
.Where(p => p.GetCustomAttribute(typeof(ViewBlockAttribute)) != null)
.Select(p => p.Name)
.ToList();
}
}
[Display(Name = "产品目录", Description = "可以将产品目录作为内容的一部分")]
public virtual ICollection<ProductFolder> ProductFolders { get; set; }
}
/// <summary>
/// 产品目录
/// </summary>
public class ProductFolder
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Editable(false)]
[ScaffoldColumn(false)]
[Display(Name = "标识")]
public int Id { get; set; }
[Display(Name = "名称")]
public string Name { get; set; }
[Display(Name = "备注")]
public string Comment { get; set; }
[Display(Name = "子目录")]
public virtual ICollection<ProductFolder> Subs { get; set; }
}
控制层
public ActionResult ViewBlock(int id)
{
var item = _db.ViewBlocks.Find(id);
return View("ViewBlock", item);
}
显示层
<table>
@foreach (var p in @Html.CheckBoxListFor(m => m.FormatedParameters, Model.ParameterItems))
{
<tr>
<td>@p.Key</td>
<td>@p.Value</td>
</tr>
}
</table>
效果

勉強心を持てば、生活は虚しくない!
浙公网安备 33010602011771号