代码之家  ›  专栏  ›  技术社区  ›  Hal

MVC中心网格和显示/编辑模板

  •  2
  • Hal  · 技术社区  · 16 年前

    是否有人遇到过使用mvcontrib.ui网格的/views/shared/displaytemplates和/views/shared/edittemplates的好解决方案?

    我想我可以连接一个定制渲染器,但我更愿意做如下的事情:

    <% 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();
    %>
    

    网格中可能已经有东西可以做这个了,但我还没有找到它。任何帮助都将不胜感激。

    谢谢,

    哈尔

    3 回复  |  直到 13 年前
        1
  •  3
  •   g00fy    15 年前

    我通过修改GridRenderer和GridColumn类中的源代码来实现这一点。GridColumn中的更改是添加以下函数:

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

    然后,网格渲染器中的更改将在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
  •  2
  •   jena    13 年前

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

    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
  •  1
  •   Darin Dimitrov    16 年前

    实际上,你可以这样做:

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

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