2010-12-13 12 views

Respuesta

2

Se puede usar un campo oculto en el interior de la forma:

<% using (Html.BeginForm()) { %> 
    <%= Html.HiddenFor(x => x.Id) %> 
    <input type="submit" value="OK" /> 
<% } %> 

o pasarlo en la acción de la forma:

<% using (Html.BeginForm("index", "home", 
    new { id = RouteData.Values["id"] }, FormMethod.Post)) { %> 
    <input type="submit" value="OK" /> 
<% } %> 
+0

, pero no puedo tener httpost y HTTPGet con los mismos paramets, se puede mostrar la muestra de Cs también? – waldecir

+0

@waldecir, no, no puede tener dos acciones de controlador con los mismos argumentos. Deberá modificar las firmas de su acción GET o POST. –

+0

Sí, lo sé. mi primera página es un get id para mostrar las informaciones sobre el usuario, entonces necesito una publicación para activar/desactivar, ¿cómo sería la llamada de httppost? – waldecir

0

La forma más fácil para tal situación sencilla es dar un nombre para enviar el botón y verificar en acción si tiene valor o no. Si tiene el valor, entonces Publicación de la acción, si no, entonces Get acción:

<% using (Html.BeginForm("index", "home", 
    new { id = RouteData.Values["id"] }, FormMethod.Post)) { %> 
    <input type="submit" value="OK" name="btnActivate" /> 
<% } %> 

para CS se puede combinar conseguir y controlador de post métodos en uno:

public ActionResult Index(int? id, string btnActivate) 
{ 
     if (!string.IsNullOrEmpty(btnActivate)) 
     { 
      Activate(id.Value); 
      return RedirectToAction("NextAction"); 
     } 

    return View(); 
} 
2

Un poco tarde a la fiesta sobre esto, pero encontré una solución más fácil para lo que creo que es un caso de uso bastante común en el que indicaste en GET ("¿estás seguro de que quieres , bla, bla, bla,?") y luego actúas en POST usando mismo argumento (s).

La solución: use parámetros opcionales. No hay necesidad de ningún campo oculto y tal.

Nota: Solo probé esto en MVC3.

public ActionResult ActivateUser(int id) 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult ActivateUser(int id, string unusedValue = "") 
    { 
     if (FunctionToActivateUserWorked(id)) 
     { 
      RedirectToAction("NextAction"); 
     } 
     return View(); 
    } 

En una nota final, no se puede utilizar en lugar del String.Empty "" porque debe ser una constante en tiempo de compilación. Y es un gran lugar para poner comentarios graciosos para que otros lo encuentren :)

1

Mi enfoque no es agregar un parámetro no utilizado, ya que parece que causaría confusión, y es en general una mala práctica. En su lugar, lo que hago es añadir "mensaje" a mi nombre de acción:

public ActionResult UpdateUser(int id) 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult UpdateUserPost(int id) 
{ 
    // Do work here 
    RedirectToAction("ViewCustomer", new { customerID : id }); 
} 
19

Utilice [ActionName] atributo - de esta manera se puede tener las direcciones URL aparentemente apuntar a la misma ubicación, pero llevar a cabo diferentes acciones dependiendo del método HTTP :

[ActionName("Index"), HttpGet] 
public ActionResult IndexGet(int id) { ... } 

[ActionName("Index"), HttpPost] 
public ActionResult IndexPost(int id) { ... } 

Alternativamente se puede comprobar el método HTTP de código:

public ActionResult Index(int id) 
{ 
    if (string.Equals(this.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) 
    { ... } 
} 
Cuestiones relacionadas