ASP.NET MVC - IsPostBack все еще здесь? - PullRequest
16 голосов
/ 22 апреля 2009

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

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

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

Ответы [ 11 ]

39 голосов
/ 14 апреля 2011

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

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

}
13 голосов
/ 22 апреля 2009

IsPostBack отсутствует - все это либо POST, либо GET (или другой HTTP-глагол). Вы можете ограничить HTTP-глаголы, которые разрешено вашим действием, т.е. вы никогда не увидите запрос от запрещенного глагола, используя атрибут AcceptVerbsAttribute. Например, следующее разрешает только POST.

  [AcceptVerbs( HttpVerbs.Post )]
  [ValidateAntiForgeryToken]
  public ActionResult Update( int id )
  {
  }

Если вам нужно, чтобы одно и то же имя действия выполняло как GET / POST, так и они на самом деле делают разные вещи, вы можете либо дать им отдельные подписи, либо использовать ActionNameAttribute для псевдонима одного из действий, чтобы методы могли иметь разные имена. 1004 *

  [AcceptVerbs( HttpVerbs.Get)]
  public ActionResult List()
  {
  }

  [AcceptVerbs( HttpVerbs.Post )]
  [ValidateAntiForgeryToken]
  public ActionResult List( string filter, int page, int limit )
  {
  }

OR

  [ActionName( "List" )]
  [AcceptVerbs( HttpVerbs.Get)]
  public ActionResult ListDisplay()
  {
  }

  [AcceptVerbs( HttpVerbs.Post )]
  [ValidateAntiForgeryToken]
  public ActionResult List()
  {
  }

РЕДАКТИРОВАТЬ : обратите внимание, что я добавил проверку токена антиподделения в действиях POST. Вы действительно должны использовать это для защиты от межсайтовых скриптовых атак .

9 голосов
/ 14 октября 2014

Вы можете использовать этот кусок кода в Razor

@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}
4 голосов
/ 10 декабря 2014

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

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

1 голос
/ 05 февраля 2019

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

0 голосов
/ 06 сентября 2014

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

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

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

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

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

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

0 голосов
/ 23 апреля 2009

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

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

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

0 голосов
/ 22 апреля 2009

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

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

 public ActionResult Create()
 {...}
0 голосов
/ 22 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...