Как заставить пользовательский столбец MVC contrib grid работать с aspx
-
13-12-2019 - |
Вопрос
Я использую MVC Contrib Grid для рендеринга, сортировки и фильтрации моей таблицы данных, но теперь у меня возникли проблемы, поскольку она была обновлена для MVC3 и Razor.Пользовательский метод в моей коллекции columns не работает для страниц aspx, а метод действия columns теперь устарел.
Я использую метод grids action для рендеринга моих столбцов следующим образом в MVC 2:
...
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
column.For("View User").Named("Tools").Action(x => { %>
<td>
<%= Html.ActionLink("View", "View", new { id = p.Id })%>
<%= Html.ActionLink("Edit ", "Edit", new { id = p.Id })%>
//Snip as there are too many tools :-)
//.....
<%= Html.ActionLink("Delete", "Delete", new { id = p.Id })%>
</td>
<% });
...
Теперь, в последней версии, появился пользовательский метод, который заменяет устаревший метод Action.Я посмотрел, как это можно сделать здесь, который в основном работает для меня сейчас, но я теряю всех своих помощников в представлении aspx (url и т.д.), и теперь мне нужно отобразить мое содержимое другим методом в моей модели, как показано ниже:
...
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
//the new custom column
column.Custom(Model.ToolsRenderer);
<% });
...
Приведенный ниже метод grid model, называемый ToolsRenderer, используется для рендеринга моей html-строки.
public UserManagementViewModel : BaseModel {
//..snip
//
public object ToolsRenderer(Client client)
{
List<string> links = new List<string>();
var editLink = new TagBuilder("a");
// here is my biggest problem, before Html.ActionLink used to make
// sure that I don't have any missing links or help me if i need to
// refactor an action / controller name :-(
editLink.Attributes["href"] = GetEditUserLink(client, HttpContext.Current.Request.Url.AbsoluteUri);
editLink.SetInnerText("edit");
links.Add(editLink.ToString());
...
...lots of links to be generated here
...
return MvcHtmlString.Create(string.join(" |", links))
}
//..snip
}
Пока это работает, но есть ли способ заставить мою страницу aspx работать так же, как в представлениях razor, как показано ниже?
@Html.Grid(Model).Columns(column =>
{
column.For(x => x.Id).
column.For(x => x.Name);
column.Custom(@<td><a href='@Html.Actionlink("edit","user",new {id})' alt="@item.email"/><a></td>)
})
Я хочу сказать что-то вроде:
...
column.Custom(%><td><a href='<%=Html.Actionlink("edit","user",new {id})%>' alt="<%=item.email%>"/><a></td><%)
...
Решение
Наконец-то удалось найти работу с некоторой помощью и копать, а вместо того, чтобы использовать Custom Column, использовать столбец. Fory и нажмите HTML.Partial.Что-то вроде кода ниже.
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
// could use RenderPartial() to
column.For(x =>Html.Partial("UserActionColumn", x));
<% });
. Другие советы
для корпуса бритвы @helper можно использовать для пользовательских полей.
Например:
column.For(r => Status(r.Status)).Encode(false).Named("Status");
@helper Status(string value)
{
if (value == RequestStatus.Pending)
{
<span class="label label-info">@value</span>
}
...
}
. В дополнение к другим ответам, если вы хотите выполнить сортировку по этому пользовательскому столбцу, не забудьте добавить SortColumnName
.Если вы этого не сделаете, сетка будет использовать Named
аргумент в качестве имени столбца, но Named
также используется для присвоения заголовка столбцу.У меня просто разболелась голова, потому что название моей колонки не соответствовало названию:
column.For(c => "custom text").Named("Column Name").SortColumnName("ColumnName");