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方法。

posted @ 2010-10-08 10:44  ambar  阅读(778)  评论(2编辑  收藏  举报