2010-12-13 12 views

risposta

2

si potrebbe usare un campo nascosto all'interno del modulo:

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

o farli l'azione del modulo:

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

ma non posso avere httpost e httpget con gli stessi paramets, si può mostrare il campione per cs troppo? – waldecir

+0

@waldecir, no, non è possibile avere due azioni del controllore con gli stessi argomenti. Dovrai modificare le firme dell'azione GET o POST. –

+0

Sì, lo so. la mia prima pagina è un get con id per mostrare le informazioni sull'utente, quindi ho bisogno di un post per attivare/disattivare, come sarebbe la chiamata httppost? – waldecir

0

Il modo più semplice per tale situazione semplice è quello di dare un nome per inviare il pulsante e controllare in azione se ha valore o meno. Se si ha il valore, allora Posta azione, se non, allora Ottenere azione:

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

per CS è possibile combinare ottenere e regolatore postale metodi in uno:

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

    return View(); 
} 
2

un po 'tardi alla festa su questo, ma ho trovato una soluzione più semplice a quello che penso sia un caso d'uso abbastanza comune in cui si chiede GET ("sei sicuro di voler blah blah bla?") e poi agire sul POST utilizzando il stesso argomento (s).

La soluzione: utilizzare i parametri opzionali . Non c'è bisogno di campi nascosti e così via.

Nota: l'ho provato solo su MVC3.

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

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

In una nota finale, non è possibile utilizzare string.Empty al posto di "" perché deve essere una costante fase di compilazione. Ed è un ottimo posto per mettere commenti divertenti per qualcun altro da trovare :)

1

Il mio approccio non è quello di aggiungere un parametro inutilizzato in quanto sembra causare confusione ed è in generale una cattiva pratica. Invece, quello che faccio è aggiungere "Post" al mio nome dell'azione:

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

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

Usa [ActionName] attributo - in questo modo è possibile avere gli URL apparentemente puntare alla stessa posizione, ma eseguire azioni diverse a seconda del metodo HTTP :

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

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

in alternativa, è possibile controllare il metodo HTTP in codice:

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