Domanda

Sto usando la griglia del contributo MVC per il rendering, l'ordinamento e il filtraggio della mia griglia dei dati, ma sto avendo problemi ora che è stato aggiornato per MVC3 e Razor. Il metodo personalizzato nella raccolta delle colonne non funziona per le pagine ASPX e il metodo di azione delle colonne è ora obsoleto.

Io uso Grids Action Method per rendere le mie colonne come questa in 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>
            <% });
 ...
.

Ora con l'ultima versione è presente un metodo personalizzato che sostituisce il metodo di azione obsoleto. Ho guardato come può essere fatto qui dentro , che praticamente funziona per me ora, ma perdo tutti i miei aiutanti nella vista ASPX (URL, ecc.), E ora è necessario eseguire il mio contenuto in un altro metodo nel mio modello come di seguito:

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

Il metodo del modello di rete di seguito chiamato ToolsRenderer viene utilizzato per rendere la mia stringa 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
}
.

Funziona per ora, ma c'è un modo per ottenere la mia pagina ASPX funziona come la vista del rasoio come sotto?

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

})
.

Voglio dire qualcosa come:

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

È stato utile?

Soluzione

Finalmente riuscito a trovare un lavoro in giro con un po 'di aiuto e scavare, invece di utilizzare la colonna personalizzata, utilizzare la colonna. Per e spingere in HTML.Partial.Qualcosa come il codice qui sotto.

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

        <% });
.

Altri suggerimenti

Per il caso di rasoio @helper può essere utilizzato per campi personalizzati.

Ad esempio:

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

Completando le altre risposte, se si desidera ordinare per quella colonna personalizzata, non dimenticare di aggiungere un SortColumnName.Se non lo fai, la griglia utilizzerà l'argomento Named come nome della colonna, ma Named viene anche utilizzato per dare un titolo alla colonna.Ho appena avuto un mal di testa perché il mio nome della colonna non corrisponde al titolo:

column.For(c => "custom text").Named("Column Name").SortColumnName("ColumnName");
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top