MVCContrib Grid如何同时显示占位空文本和表格头
第一次使用ASP.NET MVC,任何地方都比ASP.NET干净,感觉很不错。
表格输入用的是MvcContrib。最新的源代码和release的相比,已经重构了大部分代码。但是在使用中,简单的覆盖RenderHeader方法并不能达到想要的效果。把Render部分浏览一遍之后发现,只有覆盖RenderEmpty方法并且把RenderHeader方法再应用一次。
cs文件:
public class AlwaysShowGridHeaderRenderer<T> : HtmlTableGridRenderer<T> where T : class
{
/// <summary>
/// 重写RenderEmpty方法,附加部分RenderHeader方法
/// </summary>
protected override void RenderEmpty()
{
RenderHeadStart();
// 需要计算列数目
var columns = VisibleColumns();
var colspan = columns.Count();
foreach (var column in columns)
{
if (column.CustomHeaderRenderer != null) {
column.CustomHeaderRenderer(new RenderingContext(Writer, Context, _engines));
}
else {
RenderHeaderCellStart(column);
RenderHeaderText(column);
RenderHeaderCellEnd();
}
}
RenderHeadEnd();
RenderBodyStart();
// 写入空行,带自定义文本
Writer.Write(string.Format("<tr class=\"emptyrow\" ><td colspan=\"{0}\">{1}</td></tr>", colspan,this.GridModel.EmptyText));
RenderBodyEnd();
}
private readonly ViewEngineCollection _engines;
}
View调用:
<%
Html
.Grid(Model)
.Empty("暂无软件")
.Attributes(@id => "tb-Software", width => "400")
.RowAttributes(r => new Hash(data => string.Format("{{id:'{0}'}}", r.Item.SoftwareId)))
.Columns(col => {
col.For(c => c.Name).Named("软件名称")
.HeaderAttributes(@width => "100px", data => "{required:true,name:'Name',type:'text'}");
col.For(c => c.Comment).Named("软件备注")
.HeaderAttributes(@width => "200px", data => "{name:'Comment',type:'textarea'}");
col.For(c => string.Format(@"<a class=""edit"" href=""javascript:;"">编辑</a> |
<a class=""delete"" href=""javascript:;"">删除</a> ", c.SoftwareId)).Encode(false);
})
.RenderUsing(new ZFCRM.AlwaysShowGridHeaderRenderer<ZFCRM.Models.Software>())
.Render();
%>
调用时唯一要注意的是,必须在结尾显示调用Render方法。