Как заставить пользовательский столбец MVC contrib grid работать с aspx

StackOverflow https://stackoverflow.com//questions/12711021

Вопрос

Я использую 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");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top