2010-12-13 55 views

Répondre

2

Vous pouvez utiliser un champ caché à l'intérieur de la forme:

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

ou passer dans l'action de la forme:

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

Mais je ne peux pas avoir httpost et HttpGet avec les mêmes paramets, pouvez-vous montrer l'échantillon pour .cs aussi? – waldecir

+0

@waldecir, non, vous ne pouvez pas avoir deux actions de contrôleur avec les mêmes arguments. Vous devrez modifier les signatures de votre action GET ou POST. –

+0

Oui, je sais. ma première page est un get avec id pour afficher les infos sur l'utilisateur, donc j'ai besoin d'un post pour activer/désactiver, comment serait l'appel httppost? – waldecir

0

La meilleure façon pour une telle situation simple est de donner un nom pour soumettre le bouton et vérifier l'action si elle a de la valeur ou non. Si elle a la valeur, alors afficherons l'action, sinon, il susciter une réaction:

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

Pour Cs vous pouvez combiner des méthodes get et contrôleur de poste en un:

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

    return View(); 
} 
2

Un peu en retard à la partie sur cela, mais j'ai trouvé une solution plus facile à ce que je pense est un cas d'utilisation assez courante lorsque vous invite GET (« êtes-vous sûr de vouloir bla bla bla? »), puis agir sur POST en utilisant la même argument (s).

La solution: utiliser paramètres optionnels. Pas besoin de champs cachés et autres.

Note: Je ne MVC3 dans ce testé.

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

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

Sur une note finale, vous ne pouvez pas utiliser string.Empty en place de "", car il doit être une constante de compilation. Et il est un excellent endroit pour mettre des commentaires drôles pour quelqu'un d'autre pour trouver :)

1

Mon approche est de ne pas ajouter un paramètre utilisé comme cela semble que ce serait une source de confusion, et est en pratique générale mauvaise. Au lieu de cela, ce que je fais est append « Post » à mon nom d'action:

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

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

Utilisez [ActionName] attribut - cette façon, vous pouvez avoir les URL pointent apparemment au même endroit, mais effectuer des actions différentes en fonction de la méthode HTTP :

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

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

Sinon, vous pouvez vérifier la méthode HTTP dans le code:

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