2011-05-11 14 views
5

Tengo una vista parcial que representa WebGrid. Mi controlador pareceCómo cambiar la acción de WebGrid para obtener datos (.NET MVC3)

public ActionResult Index() 
{ 
    return View(); 
} 
public ActionResult GetUserList(int? page, string sort, string sortdir) 
{ 
    var model = UserModel.getList(page,sort,sortdir); 
    return PartialView("_UserList",model); 
} 

Index.cshtml:
....
@Html.Action("GetUserList")

El problema es que cada vez que haga clic en la navegación de cuadrícula o Ordenar enlaces que llama Index método. ¿Cómo puedo hacer que Webgrid ejecute una acción diferente (GetUserList en este caso)? Estoy seguro de que puedo anteponer GetUserList a todos los enlaces en la cuadrícula usando jquery, pero creo que debería ser una mejor manera.
También es posible que lo que estoy haciendo esté completamente mal, así que gracias por sus sugerencias.

Respuesta

5

Después de mucho monjear y excavar (e incluso juguetear con Reflector con el código fuente de WebGrid), llegué a la conclusión de que con WebGrid, no puede controlar/cambiar la acción del enlace de encabezado.

Para crear la URL del enlace de encabezado, la ruta se toma desde HttpContext.Request.Path, por lo que no hay forma de personalizarla para que apunte a una ruta diferente.

Una muy feo corte sería la de aprovechar a los eventos de jQuery Ajax (ya que el enlace de cabecera utiliza para ordenar jQuery.load) y sobrescribir la URL:

<a href="#" onclick="$('#myGrid').load('/?sort=AlbumId&amp;sortdir=ASC&amp;__=634486582282704242 #myGrid');">Album Id</a> 

solución mejor sería utilizar:

  • Telerik cuadrícula que le permite especificar custom routes y también ofrece mucha más flexibilidad en la prestación de su diseño
  • o MvcContrib Grid (no seguro si esto le permite modificar enlaces de encabezado pero definitivamente ofrece más flexibilidad que WebGrid)
+0

No creo que esto ayude con la clasificación o paginación según la pregunta original ... –

+0

@JP: Tienes razón. Investigué un poco y actualicé mi respuesta con los hallazgos. – Mrchief

+0

¡Buena respuesta, gracias! –

2

@MrChief tenía la idea anterior sobre el feo hack ... Lo puse juntos. Aquí está el código principal que solía hacer esto. De hecho, secuestra la llamada ajax antes de ponerla en el cable. La clave es modificar la URL que se envía porque la cuadrícula tomará esa URL de HttpContext.Request.Path. y conéctelo al onclick para el elemento de anclaje.

Pongo esto en mi common.js principal y simplemente adjuntaré una función para capturar el evento ajaxSend que ocurre justo antes de que se envíen los datos.

// Used to hijack the sending of all AJAX calls. Before it sends the call to the server, it checks to see if the 
// active element (the element that prompted the call) is marked with a given class. If so, then it will perform 
// the given operation. 
$(document).ajaxSend(function (event, jqXHR, ajaxOptions) { 

    var activeElement = document.activeElement; 

    if ($(activeElement).attr('redosorturl') != null) { 

     // If this is a sort anchor link from a grid that needs to have the sort link redone, do it here. 
     // the code is in the eipGrip.js file. 
     if ($(activeElement).attr('redosorturl').toString() == 'redoSortURL') { 
      var newURL = RedoGridSortURL(activeElement, ajaxOptions.url.toString()); 
      ajaxOptions.url = newURL.toString(); 
     } 
    } 

    return false; 
}); 

Al renderizar la página, que han marcado la etiqueta en la cabecera de la columna que contiene la dirección URL incorrecta con una clase llamada "redosorturl', así que sé cuando secuestrar la llamada AJAX, la operación tiene que ser hecho en este elemento. Luego llamo a una función personalizada que me da la URL correcta, luego ajaxOptions.url se reescribe con esa nueva URL.

Tengo que pasar el activeElement a esa función de reescritura para poder recorrer el DOM para obtener la información de la cuadrícula, donde he puesto datos como el controlador y el método de acción que se utiliza junto con los ID y otra información que uso para la URL. Del mismo modo, paso la cadena de url actual porque la grilla inyectará un token un t el final de la url que analizo y pongo la nueva url.

2

Su conclusión no es correcta.Sólo tiene que envolver su WebGrid en una forma Get:

using (Html.BeginForm("GetUserList", "ThingaMaBob", System.Web.Mvc.FormMethod.Get)) 
{ 
var grid = new WebGrid(
... 
)); 

    Html.Hidden(grid.SortFieldName, grid.SortColumn); 
    Html.Hidden(grid.SortDirectionFieldName, grid.SortDirection == SortDirection.Ascending ? "ASC" : "DESC"); 
} 

Los hiddens para que el contacto dir clasificar y ordenar campo terminan en forma analizable en la cadena de consulta. Se termina con URLs como localhost/thingamabob/getUserList? Someotherfields = lo = & tipo = ciudad & sortdir = ASC

+0

Intenté esto, no funciona. usando Mvc4 – Kelmen

+0

No sé qué decir ... así es como lo tenemos en nuestra grilla de producción. –

0

Si quita [HttpPost] atributo y dejar que la ruta llega a la misma función. encontrará el valor de Solicitud ["página"] en su método. esto le permitirá poner un cheque en el valor de Solicitud ["Página"].

Cuestiones relacionadas