Ответ 1
Если кому-то все еще интересно, вы можете проверить POST из метода действия MVC следующим образом:
if (Request.HttpMethod=="POST") {
}
Я знаю, я знаю, я знаю. Я не должен делать веб-формы внутри MVC, я полностью согласен. Но люди, которые подписывают мою зарплату, сейчас не одобряют полную конвертацию нашего сайта в MVC. Поэтому я делаю шаги поэтапно, по страницам, чтобы преобразовать их во время добавления новых функций в MVC.
Итак, мой вопрос в том, как я могу получить доступ к свойству IsPostBack из контроллера?
Изменить: Чтобы уточнить, у меня есть пользовательский элемент управления webform на моей главной странице mvc, которая может инициировать обратные вызовы. Я пытаюсь определить эти postbacks стихи сообщения mvc. На этом этапе я думаю, что я просто проверю ключи формы запроса на ключ "__viewstate", и если его обнаружит, рассматриваем его как обратную передачу.
Если кому-то все еще интересно, вы можете проверить POST из метода действия MVC следующим образом:
if (Request.HttpMethod=="POST") {
}
Нет IsPostBack - все это либо POST, либо GET (или другой HTTP-глагол). Вы можете ограничить HTTP-глаголы, которые позволяют ваши действия, т.е. Вы никогда не увидите запрос от запрещенного глагола, используя AcceptVerbsAttribute. Например, следующее разрешает только POST.
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult Update( int id )
{
}
Если вам нужно, чтобы одно и то же имя действия выполняло как GET/POST, так и они действительно делали разные вещи, вы можете либо предоставить им отдельные подписи, либо использовать ActionNameAttribute для псевдонима одного из действий, чтобы методы могли иметь разные имена.
[AcceptVerbs( HttpVerbs.Get)]
public ActionResult List()
{
}
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult List( string filter, int page, int limit )
{
}
ИЛИ
[ActionName( "List" )]
[AcceptVerbs( HttpVerbs.Get)]
public ActionResult ListDisplay()
{
}
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult List()
{
}
EDIT. Обратите внимание, что я добавил проверку маркера antiforgery на действия POST. Вы действительно должны использовать это для защиты от атак межсайтового скриптинга.
Вы можете использовать этот фрагмент кода в Razor
@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}
Я часто использую этот метод (объявленный в моем классе BaseController)
protected bool IsPostBack()
{
bool isPost = string.Compare(Request.HttpMethod, "POST",
StringComparison.CurrentCultureIgnoreCase) == 0;
if (Request.UrlReferrer == null) return false;
bool isSameUrl = string.Compare(Request.Url.AbsolutePath,
Request.UrlReferrer.AbsolutePath,
StringComparison.CurrentCultureIgnoreCase) == 0;
return isPost && isSameUrl;
}
Контроллеры не наследуются от System.Web.UI.Page. Нет свойства isPostback.
Структура MVC не поддерживает классический метод обратной передачи и viewstate, используемый в веб-формах. Итак, нет, у вас нет доступа к IsPostBack.
Мой совет для вас состоит в том, чтобы иметь два ветки: один с текущим сайтом, где вы добавляете исправления для известных ошибок, и еще один, где вы строите новый сайт с нуля. Новые функции должны быть реализованы в этом. Я предполагаю, что большая часть вашей кодовой базы повторно используется на новом сайте.
Когда новый сайт будет готов, поставьте его на производство.
Почему вы пытаетесь получить это значение из контроллера? Не уверен, что это вам поможет, но вы можете использовать традиционный объект Request для получения информации, которая была отправлена формой...
Я не уверен, правильно ли понял ваш вопрос, но на контроллере у вас будет действие, которое обрабатывает начальное GET из браузера и второе действие для обработки POST.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(MyModel model)
{...}
public ActionResult Create()
{...}
Я бы определенно взглянул на это сообщение в блоге Скоттом Хансельманом, где он помещает страницу aspx в приложение MVC.
У ваших контроллеров не будет доступа к свойству ViewState. Даже если вы хотите справиться с проблемой __VIEWSTATE, вам нужно будет сделать некоторую работу, чтобы получить ее в удобной форме в контроллере mvc. Удачи вам в разработке стратегии конверсии, независимо от того, как это работает, многим людям было бы интересно узнать, какие проблемы вы столкнулись в процессе.
Если на странице MVC имеется более одной формы, вы можете добавить скрытый ввод в форму со значимым идентификатором и проверить, имеет ли оно значение. Таким образом, вам не нужно иметь два отдельных обработчика (один для получения и один для сообщения).
Так что на странице и внутри формы:
<input type="hidden" id="testForm" name="testForm" value="1"/>
И в контроллере:
if (Request.Form["testForm"] != null)
{
// ACTIONS FOR THE POSTED FORM
}
Надеюсь, что это поможет!
Для Asp.net Core 2.x вы можете создать метод расширения в HttpRequest. Исходя из @ibirite ответ может быть примерно таким:
using System;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
namespace MyApp
{
public static class HttpRequestExtensions
{
public static bool IsPostBack(this HttpRequest request)
{
var currentUrl = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
var referrer = request.Headers["Referer"].FirstOrDefault();
bool isPost = string.Compare(request.Method, "POST",
StringComparison.CurrentCultureIgnoreCase) == 0;
if (referrer == null) return false;
bool isSameUrl = string.Compare(currentUrl,
referrer,
StringComparison.CurrentCultureIgnoreCase) == 0;
return isPost && isSameUrl;
}
}
}