ASP.NET MVC - IsPostBack还在吗?

时间:2009-04-22 13:20:41

标签: asp.net-mvc webforms

我知道,我知道,我知道。我不应该在MVC中做webforms,我完全同意。但是,签署我的薪水的人不会批准我们的网站现在完全转换为MVC。因此,我逐页采取增量步骤,在MVC中添加新功能时将其转换。

所以我的问题是如何从控制器访问IsPostBack属性?

编辑:为了进一步说明,我的mvc母版页上有一个webform用户控件,可以启动回发。我试图通过mvc帖子识别这些回发。在这一点上,我想我只是检查请求表单键的“__viewstate”键,如果它被发现将其视为回发。

11 个答案:

答案 0 :(得分:39)

如果有人仍然感兴趣,你可以在MVC Action Method中测试一个POST,如下所示:

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

}

答案 1 :(得分:13)

没有IsPostBack - 一切都是POST或GET(或其他HTTP动词)。您可以使用AcceptVerbsAttribute限制您的操作允许的HTTP谓词,即,您永远不会看到来自不允许的动词的请求。例如,以下内容仅允许POST。

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

如果您需要具有相同的操作名称同时执行G​​ET / POST并且它们实际上执行不同的操作,您可以为它们分别签名或使用ActionNameAttribute为其中一个操作设置别名,以便方法可以具有不同的名称。 / p>

  [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操作中。你真的应该将它用于protect against cross-site scripting attacks

答案 2 :(得分:9)

你可以在Razor中使用这段代码

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

答案 3 :(得分: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;
 }

答案 4 :(得分:3)

控制器不从System.Web.UI.Page继承。没有isPostback属性。

答案 5 :(得分:1)

对于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;
        }
    }
}

答案 6 :(得分:0)

MVC框架不支持Web表单中使用的经典回发和视图状态。所以,不,你没有访问IsPostBack。

我的建议是拥有两个分支:一个是当前站点,您可以在其中添加已知错误的补丁,另一个分支从头开始构建新站点。应该在这一个中实现新功能。我假设您的大部分代码库都可以在新站点中重用。

新网站准备就绪后,将其投入生产。

答案 7 :(得分:0)

为什么要尝试从控制器中获取该值?不确定这是否对您有所帮助,但您仍然可以使用传统的Request对象来获取表单提交的信息...

答案 8 :(得分:0)

我不确定我是否正确理解了你的问题,但是在控制器上你会有一个操作来处​​理来自浏览器的初始GET以及第二个处理POST的操作。

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

 public ActionResult Create()
 {...}

答案 9 :(得分:0)

我肯定会看一下Scott Hanselman的博客文章,他将一个aspx页面放在一个MVC应用程序中。

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

您的控制器无权访问ViewState属性。即使你确实想要处理__VIEWSTATE的问题,你也必须做一些工作才能在mvc控制器中将它变成可用的形式。祝你想出一个转换策略好运,无论它如何运作,很多人都会对你在这个过程中遇到的问题感兴趣。

答案 10 :(得分:0)

如果MVC页面中有多个表单,则可以在表单中添加具有有意义ID的隐藏输入,并测试它是否具有值。这样你就不需要有两个独立的处理程序(一个用于get,一个用于post)。

所以在页面内和表单内:

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

在控制器中:

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

希望它有所帮助!