Question

Je suis l'aide de la MVC Contrib Grille pour le rendu, de tri et de filtrage ma grille de données, mais je vais avoir des problèmes maintenant qu'il a été mis à jour pour MVC3 et Rasoir.La méthode Personnalisée dans ma collection de colonnes ne fonctionne pas pour les pages aspx , et les colonnes de la méthode d'Action est aujourd'hui obsolète.

J'ai utiliser des grilles d'action afin de rendre mes colonnes comme ceci dans 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>
            <% });
 ...

Maintenant avec la dernière version il y a une méthode Personnalisée qui remplace la vieille méthode d'Action.J'ai regardé comment il peut être fait ici, qui fonctionne pour moi maintenant, mais je perds tous mes assistants dans le aspx vue (url, etc), et maintenant besoin de rendre mes contenus dans une autre méthode dans mon modèle comme ci-dessous:

 ...
 <% 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);
            <% });
 ...

Le modèle de grille méthode ci-dessous appelé ToolsRenderer est utilisé pour le rendu de ma chaîne 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
}

Cela fonctionne pour l'instant, mais est-il un moyen d'obtenir ma page aspx travail comme le rasoir vues comme ci-dessous?

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

})

Je veux dire quelque chose comme:

...     
column.Custom(%><td><a href='<%=Html.Actionlink("edit","user",new {id})%>' alt="<%=item.email%>"/><a></td><%)
...
Était-ce utile?

La solution

a finalement réussi à trouver un travail autour de l'aide et de la creuse, et au lieu d'utiliser la colonne personnalisée, utilisez la colonne. Pour et appuyer dans le HTML.Partial.Quelque chose comme le code ci-dessous.

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

        <% });

Autres conseils

pour le boîtier de rasoir @Helper peut être utilisé pour des champs personnalisés.

Par exemple:

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>
    }
    ...
}

En complétant les autres réponses, si vous souhaitez trier par colonne personnalisée, n'oubliez pas d'ajouter un SortColumnName.Si vous ne le faites pas, la grille va utiliser la Named argument est le nom de la colonne, mais Named est également utilisé pour donner un titre à la colonne.J'ai juste eu un mal de tête parce que mon nom de colonne n'a pas de match le titre:

column.For(c => "custom text").Named("Column Name").SortColumnName("ColumnName");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top