【问题标题】:MvcContrib Grid and Display/Edit TemplatesMvcContrib 网格和显示/编辑模板
【发布时间】:2011-02-22 01:49:07
【问题描述】:

有没有人遇到过将 ./Views/Shared/DisplayTemplates 和 ./Views/Shared/EditTemplates 与 MvcContrib.UI Grid 一起使用的好解决方案?

我想我可以连接一个 CustomItemRenderer,但我更希望能够执行以下操作:

<% Html.Grid<Person>(Model.People)
         .Sort(new GridSortOptions {Column = Model.Column, Direction = Model.Direction})
         .Columns(column =>
         {
           column.For(e=>e.Name);
           column.DisplayFor(e=>e.StartDate); // <-- I'd like to do this for DateTime.asxc
         }).Render();
%>

Grid 中可能已经有一些东西可以做到这一点,但我还没有找到它。任何帮助将不胜感激。

谢谢,

哈尔

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 mvccontrib mvccontrib-grid


    【解决方案1】:

    我通过修改 GridRenderer 和 GridColumn 类中的源代码实现了这一点。 GridColumn的变化是增加了如下函数:

    public object GetRawValue(T instance)
    {
      if (!_cellCondition(instance))
      {
        return null;
      }
    
      var value = _columnValueFunc(instance);
      return value;
    }
    

    那么GridRenderer中的变化就是在RenderItem函数中要改成如下:

     protected virtual void RenderItem(GridRowViewData<T> rowData)
    {
      BaseRenderRowStart(rowData);
    
      HtmlHelper<T> html = new HtmlHelper<T>(Context, new ViewPage());
      foreach (var column in VisibleColumns())
      {
        //A custom item section has been specified - render it and continue to the next iteration.
        if (column.CustomItemRenderer != null)
        {
          column.CustomItemRenderer(new RenderingContext(Writer, Context, _engines), rowData.Item);
          continue;
        }
    
        RenderStartCell(column, rowData);
    
        var cellValue = column.GetRawValue(rowData.Item);
        if (cellValue != null)
        {
          //RenderText(cellValue.ToString());         
          MvcHtmlString value = html.DisplayFor<T, object>(m => cellValue);
          string str = (value.ToString() == string.Empty) ? cellValue.ToString() : value.ToString();
          if (column.HtmlEncode == true)
          {
            str = (value.ToString() == string.Empty) ? HttpUtility.HtmlEncode(cellValue.ToString()) : value.ToHtmlString();
          }
          RenderText(str);
        }
    
        RenderEndCell();
      }
    
      BaseRenderRowEnd(rowData);
    }
    

    执行此操作后,网格将使用找到的模板。我只使用 DisplayTemplates 进行了测试,因为这就是我所需要的,但它也应该适用于 EditorTemplates,只需稍作改动。

    【讨论】:

      【解决方案2】:

      我已经创建了这个扩展方法:

      public static IGridColumn<Column> DisplayFor<Column, Model, Value>(this ColumnBuilder<Column> column, HtmlHelper<Model> html, Func<Column, Value> getValueFunc)
          where Column : class
      {
          return column.Custom(o =>
                                   {
                                       var value = getValueFunc(o);
                                       return MvcHtmlString.Create("<span>" + html.DisplayFor(modelItem => value) + "</span>");
                                   });
      }
      

      用法如下:

      column.DisplayFor(Html, sector => sector.Created);
      

      【讨论】:

        【解决方案3】:

        其实你可以这样做:

        column
            .For(model => model.StartDate)
            .Partial("~/Views/Shared/DisplayTemplates/YourModelName.ascx");
        

        这种方法的问题是整个模型将被传递给部分而不是简单的属性。

        【讨论】:

          猜你喜欢
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多