MVCCONTRIB Сетка и отображение / редактирование шаблонов
-
04-10-2019 - |
Вопрос
Кто-нибудь столкнулся с хорошим решением для использования ./views/mared/displaytemplates и ./views/shared/edittemplates с grid mvccontrib.ui?
Я думаю, я мог бы подключить 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();
%>
Там уже может быть что-то в сетке, чтобы сделать это, и я просто еще не нашел его. Любая помощь будет очень ценится.
Спасибо,
Потрясающий
Решение
Я достиг этого, изменяя исходный код в классах Gridrender и Gridcolumn. Изменение в GridColumn - добавить следующую функцию:
public object GetRawValue(T instance)
{
if (!_cellCondition(instance))
{
return null;
}
var value = _columnValueFunc(instance);
return value;
}
Затем изменение в Gridrenderer находится в функции рендерета, которая должна быть изменена следующим образом:
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, так как это все, что мне нужно, но это также должно работать для редактирования для редактирования с небольшим изменением.
Другие советы
Я создал этот метод расширения:
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");
Проблема с таким подходом состоит в том, что вся модель будет передана частичной, а не просто имуществом.