Mam kontroler, aby wyświetlić model (użytkownika) i chcę utworzyć ekran za pomocą przycisku, aby aktywować. Nie chcę pól w formularzu. Mam już identyfikator w adresie URL. Jak mogę to zrobić?Jak utworzyć httppost uzyskujący te same parametry z httpget?
Odpowiedz
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" />
<% } %>
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();
}
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 :)
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 });
}
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))
{ ... }
}
Ale nie mogę mieć httpost i HttpGet z samych paramets można pokazać próbkę do .cs też? – waldecir
@walsządek, nie, nie możesz mieć dwóch akcji kontrolera z tymi samymi argumentami. Będziesz musiał zmodyfikować podpisy akcji GET lub POST. –
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