2010-03-17 24 views
10

Con ASP.net MVC es posible enviar un formulario a una acción del controlador que incluye parámetros que no están en el formulario, sino en la URL?ASP.NET MVC - Método de acción POST con parámetros adicionales desde la dirección URL

Por ejemplo

el método de acción en GroupController:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(int idOne, int idTwo, Model model) 
    { ... } 

La ruta:

"{controller}/{action}/{idOne}/{idTwo}" 

URL Publicado:

/Employee/Show/1/42 

En este ejemplo, la forma es siendo publicado en un controlador diferente, el modelo tiene el valor correcto, sin embargo los otros parámetros tienen valores por defecto 0.

El comportamiento que esperaba es que el ModelBinder vería que tengo dos parámetros que coinciden con la ruta dada, y asigne el actual valores de 1 y 42 a los parámetros de la misma manera que funciona una operación GET.

¿No se admite este comportamiento o me falta algo?

EDITAR: Para ser claros, el formulario a la vista Show para el controlador Employee contiene un formulario que se anuncio a un controlador diferente. Podemos llamarlo Group.

La URL de acción forma se parece a esto

/Groups/Create/0/0 

se declara La forma de la siguiente manera

Html.BeginForm("Create", "Groups") 

Después de probar muchas sobrecargas diferentes para Html.BeginForm he encontrado que los parámetros sólo se asignan cuando el formulario La URL de acción coincide con la URL actual en la barra de direcciones del navegador.

Así que si navego a la URL /Groups/Create/1/42 tendré un formulario nuevo. Si luego envío el formulario, los valores de ruta de URL se pasan a la acción POST.

+2

Me gustaría tratar de definir la ruta para incluir el modelo y se establece como un valor predeterminado es NULL y ver qué pasa. '{controller}/{action}/{idOne}/{idTwo}/{Model}' –

Respuesta

8

Si entiendo su pregunta correctamente, quiere que action del elemento <form> prestado apunte a la URL que contiene los valores de ruta. Esto debería ser posible con una de las sobrecargas del método HtmlHelper.BeginForm() extensión:

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post); 

Avísame si tengo una pregunta mal :)

+0

Tipo de. Como indiqué en la pregunta, la acción ya contiene una URL con los valores de ruta correctos (1 y 42 del ejemplo). El problema es cuando entro en la acción de ejecución, los dos parámetros tienen valor 0. Intenté su sugerencia, pero los valores todavía eran 0. – Karl

2

Estoy bastante seguro de que sólo se puede publicar los datos del formulario de las entradas dentro de la forma. ¿Ha considerado renderizar la vista de tal manera que cree valores de entrada de formulario fuera de la URL (quizás con un ayudante de HTML?).

ACTUALIZACIÓN: Si no desea utilizar el formulario, utilice ControllerContext.RouteData.Values["idOne"] en lugar de pasarlo a través de la firma del método.

+0

Dentro del formulario hice una consulta a los valores de ruta, ViewContext.RouteData.Values ​​[" idOne "], sin embargo, en la página final representada tiene un valor de 0, no el valor de la ruta. ¿Hay algún otro enfoque para obtener los valores de ruta de URL actuales dentro de una vista/parcial? – Karl

+0

Si usa una extensión de ayuda Html, debería poder verla fuera de la instancia de ayuda. La sintaxis se vería como 'helper.ViewContext.RouteData.Values ​​[" idOne "]'. Alternativamente, puede almacenar esos valores de ID en un modelo de vista y pasarlo a la vista de esa manera. –

+0

+1 Mismos pensamientos. ¿Por qué no incluirlo en valores como campos ocultos dentro de Html.BeginForm ("Crear", "Grupos")? Además, ¿debería estar "publicando" para crear un nuevo formulario? – Ahmad

0

Recientemente tuve este problema también, y porque tenía una ruta diferente, que era de mapeo para la ruta por defecto, sin tener en cuenta el params ruta adicional que estaba pasando en.

Así que para que funcione rápidamente, escribí el formulario usando etiquetas de formulario en su lugar, y usé @ Url.Action para crear la acción requerida.

0

Una vez que llegue a su vista Crear, los valores de ruta utilizados para llegar allí deben volver a publicarse en la acción posterior.

Entonces, una opción es tener un par de hiddens para guardar los identificadores que provienen de la ruta. De esta manera, una vez que publique las formas, sus valores se publicarán junto con las otras entradas.

0

Tuve un problema similar, la configuración RouteConfig ha resuelto este problema.

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      ... 
      routes.MapRoute(
      "MyRoute", 
      "{controller}/{action}/{idOne}/{idTwo}", 
      new 
      { 
       controller = "Employee", // as an example 
       action = "Show", 
       idOne = UrlParameter.Optional, 
       idTwo= UrlParameter.Optional 
      }, new { idOne = @"\d{1,5}" }); 

     } 
    } 

... Y ... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post)) 

Escribe una etiqueta de apertura a la respuesta. Cuando el usuario envía el formulario, la solicitud será procesada por el destino de la ruta. Este miembro está sobrecargado. Para obtener información completa sobre este miembro, incluyendo sintaxis, uso y ejemplos, haga clic en un nombre en la lista de sobrecarga .

y todos los trabajos

Cuestiones relacionadas