سؤال

هل صادف أي شخص حلاً جيدًا لاستخدام ./views/shared/displaytemplates و.

أظن أنه يمكنني توصيل 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();
%>

قد يكون هناك بالفعل شيء في الشبكة للقيام بذلك ولم أجده بعد. أي مساعدة سيكون موضع تقدير كبير.

شكرًا،

هال

هل كانت مفيدة؟

المحلول

لقد حققت هذا عن طريق تعديل الكود المصدر في فصول 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 لأن هذا هو كل ما أحتاجه ، ولكن يجب أن يعمل أيضًا من أجل تحرير OitTorments مع تغيير طفيف.

نصائح أخرى

لقد أنشأت طريقة التمديد هذه:

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

في الواقع يمكنك القيام بذلك:

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

المشكلة في هذا النهج هي أن النموذج بأكمله سيتم نقله إلى الممتلكات الجزئية وليس مجرد الملكية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top