ASP.NET MVC - IsPostBack все еще здесь?

Я знаю, я знаю, я знаю. Я не должен делать веб-формы внутри MVC, я полностью согласен. Но люди, которые подписывают мою зарплату, сейчас не одобряют полную конвертацию нашего сайта в MVC. Поэтому я делаю шаги поэтапно, по страницам, чтобы преобразовать их во время добавления новых функций в MVC.

Итак, мой вопрос в том, как я могу получить доступ к свойству IsPostBack из контроллера?

Изменить: Чтобы уточнить, у меня есть пользовательский элемент управления webform на моей главной странице mvc, которая может инициировать обратные вызовы. Я пытаюсь определить эти postbacks стихи сообщения mvc. На этом этапе я думаю, что я просто проверю ключи формы запроса на ключ "__viewstate", и если его обнаружит, рассматриваем его как обратную передачу.

Ответы

Ответ 1

Если кому-то все еще интересно, вы можете проверить POST из метода действия MVC следующим образом:

if (Request.HttpMethod=="POST") { 

}

Ответ 2

Нет 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. Вы действительно должны использовать это для защиты от атак межсайтового скриптинга.

Ответ 3

Вы можете использовать этот фрагмент кода в Razor

@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}

Ответ 4

Я часто использую этот метод (объявленный в моем классе 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;
 }

Ответ 5

Контроллеры не наследуются от System.Web.UI.Page. Нет свойства isPostback.

Ответ 6

Структура MVC не поддерживает классический метод обратной передачи и viewstate, используемый в веб-формах. Итак, нет, у вас нет доступа к IsPostBack.

Мой совет для вас состоит в том, чтобы иметь два ветки: один с текущим сайтом, где вы добавляете исправления для известных ошибок, и еще один, где вы строите новый сайт с нуля. Новые функции должны быть реализованы в этом. Я предполагаю, что большая часть вашей кодовой базы повторно используется на новом сайте.

Когда новый сайт будет готов, поставьте его на производство.

Ответ 7

Почему вы пытаетесь получить это значение из контроллера? Не уверен, что это вам поможет, но вы можете использовать традиционный объект Request для получения информации, которая была отправлена ​​формой...

Ответ 8

Я не уверен, правильно ли понял ваш вопрос, но на контроллере у вас будет действие, которое обрабатывает начальное GET из браузера и второе действие для обработки POST.

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Create(MyModel model)
 {...}

 public ActionResult Create()
 {...}

Ответ 9

Я бы определенно взглянул на это сообщение в блоге Скоттом Хансельманом, где он помещает страницу aspx в приложение MVC.

http://www.hanselman.com/blog/PlugInHybridsASPNETWebFormsAndASPMVCAndASPNETDynamicDataSideBySide.aspx

У ваших контроллеров не будет доступа к свойству ViewState. Даже если вы хотите справиться с проблемой __VIEWSTATE, вам нужно будет сделать некоторую работу, чтобы получить ее в удобной форме в контроллере mvc. Удачи вам в разработке стратегии конверсии, независимо от того, как это работает, многим людям было бы интересно узнать, какие проблемы вы столкнулись в процессе.

Ответ 10

Если на странице MVC имеется более одной формы, вы можете добавить скрытый ввод в форму со значимым идентификатором и проверить, имеет ли оно значение. Таким образом, вам не нужно иметь два отдельных обработчика (один для получения и один для сообщения).

Так что на странице и внутри формы:

 <input type="hidden" id="testForm" name="testForm" value="1"/>

И в контроллере:

if (Request.Form["testForm"] != null)
        { 
        // ACTIONS FOR THE POSTED FORM
        }

Надеюсь, что это поможет!

Ответ 11

Для 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;
        }
    }
}