2010-12-13 11 views

Odpowiedz

2

Można użyć ukrytego pola wewnątrz postaci:

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

lub przekazać je w działaniu w postaci:

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

Ale nie mogę mieć httpost i HttpGet z samych paramets można pokazać próbkę do .cs też? – waldecir

+0

@walsządek, nie, nie możesz mieć dwóch akcji kontrolera z tymi samymi argumentami. Będziesz musiał zmodyfikować podpisy akcji GET lub POST. –

+0

Tak, wiem. moja pierwsza strona to get z id, aby wyświetlić informacje o użytkowniku, więc potrzebuję postu do aktywacji/dezaktywacji, jak by było wywołanie httppost? – waldecir

0

najłatwiej takiej prostej sytuacji jest nadanie nazwy przesłać przycisk i sprawdzić w działaniu, czy ma wartość, czy nie. Jeśli ma wartość, to zadaj działania, jeśli nie, to Get działanie:

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

do CS można połączyć GET i kontrolera po metody w jednym:

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

    return View(); 
} 
2

Trochę późno na imprezę, ale znalazłem łatwiejsze rozwiązanie tego, co uważam za dość powszechny przypadek użycia, w którym pytasz GET ("czy na pewno chcesz bla bla bla??"), a następnie działać na POST za pomocą ten sam argument (y).

Rozwiązanie: użyj opcjonalnych parametrów. Nie ma żadnych ukrytych pól i takich.

Uwaga: testowałem to tylko w MVC3.

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

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

Na koniec dodam, że nie można używać string.Empty zamiast "" ponieważ musi być stałą czasu kompilacji. I jest to świetne miejsce na umieszczanie zabawnych komentarzy dla kogoś innego :)

1

Moje podejście nie polega na dodaniu nieużywanego parametru, ponieważ wydaje się, że spowodowałoby to zamieszanie i jest ogólnie złym zwyczajem. Zamiast tego, co mogę zrobić, to dołączyć „post” do mojego imienia Działanie:

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

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

Użyj [ActionName] atrybut - w ten sposób można mieć adresy URL pozornie wskazywać na tym samym miejscu, ale wykonywać różne czynności w zależności od metody HTTP :

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

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

Alternatywnie można sprawdzić metodę HTTP w kodzie:

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