Как создать httppost, получая те же параметры из httpget?
У меня есть контроллер, чтобы показать модель (Пользователь) и хотят создать экран с кнопкой активации. Мне не нужны поля в форме. У меня уже есть идентификатор в URL. Как я могу это сделать?
5 ответов
Вы можете использовать скрытое поле в форме:
<% using (Html.BeginForm()) { %>
<%= Html.HiddenFor(x => x.Id) %>
<input type="submit" value="OK" />
<% } %>
или передайте его в действии формы:
<% using (Html.BeginForm("index", "home",
new { id = RouteData.Values["id"] }, FormMethod.Post)) { %>
<input type="submit" value="OK" />
<% } %>
использовать атрибут [ActionName] - таким образом, URL-адреса могут указывать на одно и то же место, но выполнять разные действия в зависимости от метода HTTP:
[ActionName("Index"), HttpGet]
public ActionResult IndexGet(int id) { ... }
[ActionName("Index"), HttpPost]
public ActionResult IndexPost(int id) { ... }
в качестве альтернативы вы можете проверить метод HTTP в коде:
public ActionResult Index(int id)
{
if (string.Equals(this.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
{ ... }
}
немного поздно для партии на этом, но я нашел более простое решение того, что я думаю, является довольно распространенным случаем использования, когда вы предлагаете GET ("вы уверены, что хотите бла бла бла?"), а затем действовать на POST, используя тот же аргумент(ы).
решение: использовать дополнительные параметры. Не нужно никаких скрытых полей и тому подобного.
примечание: Я только проверил это в MVC3.
public ActionResult ActivateUser(int id)
{
return View();
}
[HttpPost]
public ActionResult ActivateUser(int id, string unusedValue = "")
{
if (FunctionToActivateUserWorked(id))
{
RedirectToAction("NextAction");
}
return View();
}
на последней ноте вы не можете использовать string.В пустые места ""
потому что это должна быть константа времени компиляции. И это отличное место, чтобы поставить Смешные комментарии для кого-то еще, чтобы найти:)
мой подход не заключается в добавлении неиспользуемого параметра, поскольку это, похоже, вызовет путаницу и в целом плохая практика. Вместо этого я добавляю "Post" к моему имени действия:
public ActionResult UpdateUser(int id)
{
return View();
}
[HttpPost]
public ActionResult UpdateUserPost(int id)
{
// Do work here
RedirectToAction("ViewCustomer", new { customerID : id });
}
самый простой способ для такой простой ситуации-дать имя для отправки кнопки и проверить действие, если оно имеет значение или нет. Если он имеет значение, то это действие Post, если нет, то он получает действие:
<% using (Html.BeginForm("index", "home",
new { id = RouteData.Values["id"] }, FormMethod.Post)) { %>
<input type="submit" value="OK" name="btnActivate" />
<% } %>
для Cs вы можете объединить методы get и post controller в одном:
public ActionResult Index(int? id, string btnActivate)
{
if (!string.IsNullOrEmpty(btnActivate))
{
Activate(id.Value);
return RedirectToAction("NextAction");
}
return View();
}