C# 如何简化这个MVC Razor列表渲染器?
我目前正在使用多种方法来生成大小HTML块,如下面的答案所述: 我还可以添加一个额外的功能——我还使用优秀的使用模式来创建自己的HTML容器类,即C# 如何简化这个MVC Razor列表渲染器?,c#,.net,asp.net-mvc,razor,C#,.net,Asp.net Mvc,Razor,我目前正在使用多种方法来生成大小HTML块,如下面的答案所述: 我还可以添加一个额外的功能——我还使用优秀的使用模式来创建自己的HTML容器类,即 using Html.BeginWidget("title") { // Add things inside widget. } 到目前为止,这已经证明非常方便,可以使视图易于阅读和维护。这一点很重要,因为这项工作的一部分是允许设计人员和其他技术非开发人员创建和维护他们自己的视图,方法是使其足够简单,以供他们使用,或者制作服务器端工具以生
using Html.BeginWidget("title")
{
// Add things inside widget.
}
到目前为止,这已经证明非常方便,可以使视图易于阅读和维护。这一点很重要,因为这项工作的一部分是允许设计人员和其他技术非开发人员创建和维护他们自己的视图,方法是使其足够简单,以供他们使用,或者制作服务器端工具以生成默认表单视图
为了达到这一点,我目前正在尝试标准化列表的呈现,并将所有代码封装在所有排序、筛选和搜索之后。每个视图上都可能有许多这样的列表,因此很快就会失控
我的想法是使用using模式创建列表容器,然后使用Enumerator模式向视图返回每个项目的引用,如下所示:
using (HtmlList<Location> list = Html.BeginList(locations))
{
while (list.MoveNext())
{
@(list.Current.Item.Name)
}
}
HtmlListHelpers.cs
using (HtmlList<Location> list = Html.BeginList(locations))
{
while (list.MoveNext())
{
list.Current.Url = Url.Action("A", "C", new { id = list.Current.Item.ID });
using (list.RenderCurrent())
{
<img src="/Images/Icons/25/@(list.Current.Item.Icon).png" />
@(list.Current.Item.Name) <i>(@(list.Current.Item.Type))</i>
<p>@(list.Current.Item.ShortDescription)</p>
}
}
}
public class HtmlList<T> : IDisposable
{
private HtmlListItem current;
private IEnumerator<T> enumerator;
private HtmlHelper html;
private IEnumerable<T> items;
private StringBuilder stringBuilder;
protected internal HtmlList(HtmlHelper html)
{
this.html = html;
}
public HtmlListItem Current { get { return this.current; } }
public IEnumerable<T> Items
{
get { return this.items; }
protected internal set
{
this.items = value;
this.enumerator = this.items.GetEnumerator();
}
}
public void Dispose()
{
this.EndRender();
}
public bool MoveNext()
{
if (this.enumerator.MoveNext())
{
this.current = new HtmlListItem(html, this.enumerator.Current);
return true;
}
this.current = HtmlListItem.None;
return false;
}
public HtmlListItem RenderCurrent()
{
return this.current.BeginRender();
}
protected internal virtual HtmlList<T> BeginRender()
{
this.stringBuilder = new StringBuilder();
this.stringBuilder.Append("<div class=\"list\">");
this.html.ViewContext.Writer.Write(stringBuilder.ToString());
this.stringBuilder = null;
return this;
}
protected internal virtual void EndRender()
{
this.html.ViewContext.Writer.Write("</div>");
}
public class HtmlListItem : IDisposable
{
private static HtmlListItem none = null;
private string cssClass = "";
private HtmlHelper html;
private T item;
private StringBuilder stringBuilder;
private string url = "";
public HtmlListItem(HtmlHelper html, T item)
{
this.html = html;
this.item = item;
}
public static HtmlListItem None { get { return HtmlListItem.none; } }
public string CssClass { get { return this.cssClass; } set { this.cssClass = value; } }
public T Item { get { return this.item; } }
public string Url { get { return this.url; } set { this.url = value; } }
public void Dispose()
{
this.EndRender();
}
protected internal virtual HtmlListItem BeginRender()
{
this.stringBuilder = new StringBuilder();
this.stringBuilder.Append("<a");
if (this.Url != "")
{
this.stringBuilder.Append(" href=\"" + this.Url + "\"");
}
if (this.CssClass != "")
{
this.stringBuilder.Append(" class=\"" + this.CssClass + "\"");
}
this.stringBuilder.Append(">");
this.html.ViewContext.Writer.Write(stringBuilder.ToString());
this.stringBuilder = null;
return this;
}
protected internal virtual void EndRender()
{
this.html.ViewContext.Writer.Write("</a>");
}
}
}
public static class HtmlListHelpers
{
public static HtmlList<T> BeginList<T>(this HtmlHelper html, IEnumerable<T> listItems)
{
return new HtmlList<T>(html) { Items = listItems }.BeginRender();
}
}