使用泛型和LINQ MVC3 HtmlHelpers
作者:互联网
更新
我正在尝试创建一个HtmlHelper扩展程序,该扩展程序具有接受TModels集合的功能.然后设置一个表达式,该表达式将获取集合中每个项目的声明属性并打印出来.
下面的代码可以正常工作.但是,我目前不喜欢的模式中有一件事是无法推断出泛型类型.我必须为扩展方法声明类型.
我正在尝试遵循Telerik用于其Grid的模式类型,在该模式下,当您声明模型时,便会推断出通用类型.
我想这样做:
@model List<MyProject.MyModels.UserModel>
@(Html.MyExtensions()
.PrintUsers(Model)
.FirstName(m => m.FirstName)
.LastName(m => m.LastName)
)
按照我目前的模式,我必须这样做:
@model List<MyProject.MyModels.UserModel>
@(Html.MyExtensions<List<MyProject.MyModels.UserModel>, MyProject.MyModels.UserModel>()
.PrintUsers(Model)
.FirstName(m => m.FirstName)
.LastName(m => m.LastName)
)
因此,我需要找出一个更好的模式,以便推断出我的类型.
有任何想法吗?
UserModel看起来像:
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
所以我有一个HtmlHelper看起来像这样:
public static class UIExtension
{
public static ComponentFactory<TModel, T> MyExtensions<TModel, T>(this HtmlHelper<TModel> html)
where TModel : IEnumerable<T>
where T : class
{
return new ComponentFactory<TModel, T>(html);
}
}
因此,我的组件之一将获取一个List,然后遍历通过Linq Expression将每个声明的属性打印到页面.
在我的ComponentFactory中,我有:
public class ComponentFactory<TModel, T>
where T : class
{
private HtmlHelper<TModel> _html;
public ComponentFactory()
{
}
public ComponentFactory(HtmlHelper<TModel> html)
{
this._html = html;
}
public ListComponent<T> PrintUsers(IEnumerable<T> model)
{
return new ListComponent<T>(model);
}
/* Add other ui components to this factory */
}
然后我的ListComponent
public class ListComponent<T> : IHtmlString
{
private Expression<Func<T, string>> _firstname;
private Expression<Func<T, string>> _lastname;
private IEnumerable<T> _model;
public ListComponent(IEnumerable<T> model)
{
this._model = model;
}
public ListComponent<T> FirstName(Expression<Func<T, string>> property)
{
this._firstname = property;
return this;
}
public ListComponent<T> LastName(Expression<Func<T, string>> property)
{
this._lastname = property;
return this;
}
public override MvcHtmlString Render()
{
TagBuilder container = new TagBuilder("div");
TagBuilder title = new TagBuilder("div");
title.InnerHtml = "<b>Names</b>";
container.InnerHtml = title.ToString(TagRenderMode.Normal);
TagBuilder ul = new TagBuilder("ul");
foreach (var item in this._model)
{
TagBuilder li = new TagBuilder("li");
li.SetInnerText(String.Format("{0} {1}", _firstname.Compile()(item), _lastname.Compile()(item)));
ul.InnerHtml += li.ToString(TagRenderMode.Normal);
}
container.InnerHtml += ul.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(container.ToString(TagRenderMode.Normal));
}
}
感谢您的帮助和建议!
解决方法:
像这样的事情呢:
public static class UIExtension
{
public static ComponentFactory<TModel> MyExtensions<TModel>(this HtmlHelper<IEnumerable<TModel>> html) where TModel : class
{
return new ComponentFactory<TModel>(html);
}
}
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class ComponentFactory<TModel>
where TModel : class
{
private HtmlHelper _html;
public ComponentFactory()
{
}
public ComponentFactory(HtmlHelper<IEnumerable<TModel>> html)
{
this._html = html;
}
public ListComponent<TModel> PrintUsers(IEnumerable<TModel> model)
{
return new ListComponent<TModel>(model);
}
/* Add other ui components to this factory */
}
public class ListComponent<T> : IHtmlString
{
private Expression<Func<T, string>> _firstname;
private Expression<Func<T, string>> _lastname;
private IEnumerable<T> _model;
public ListComponent(IEnumerable<T> model)
{
this._model = model;
}
public ListComponent<T> FirstName(Expression<Func<T, string>> property)
{
this._firstname = property;
return this;
}
public ListComponent<T> LastName(Expression<Func<T, string>> property)
{
this._lastname = property;
return this;
}
public override MvcHtmlString Render()
{
TagBuilder container = new TagBuilder("div");
TagBuilder title = new TagBuilder("div");
title.InnerHtml = "<b>Names</b>";
container.InnerHtml = title.ToString(TagRenderMode.Normal);
TagBuilder ul = new TagBuilder("ul");
foreach (var item in this._model)
{
TagBuilder li = new TagBuilder("li");
li.SetInnerText(String.Format("{0} {1}", _firstname.Compile()(item), _lastname.Compile()(item)));
ul.InnerHtml += li.ToString(TagRenderMode.Normal);
}
container.InnerHtml += ul.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(container.ToString(TagRenderMode.Normal));
}
}
用法如下:
Html.MyExtensions().PrintUsers(Model).FirstName(p=>p.FirstName).LastName(p=>p.LastName)
标签:html-helper,linq,c,asp-net-mvc-3 来源: https://codeday.me/bug/20191208/2089881.html