ASP.NET MVC - 是的IsPostBack还在这里?

问题描述 投票:16回答:11

我知道,我知道,我知道。我不应该这样做MVC的内部web表单,我完全同意。但是,谁签我的薪水的人不会马上批准我们的网站,MVC完全转化。所以我采取渐进的步骤,一页一页,将它们转换了,而在MVC增加新的功能。

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

编辑:为了进一步澄清,我有我的MVC母版页上一个WebForm用户控制,可以启动回发。我试图找出这些经文回发一个MVC职位。在这一点上,我认为我会只是检查申请表键为“__VIEWSTATE”键,如果它的发现把它作为一个回传。

asp.net-mvc webforms
11个回答
43
投票

在任何情况下,仍然有兴趣,你可以测试从里面像这样的MVC操作方法一个POST:

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

}

0
投票

我肯定会看看由Scott Hanselman在这篇博客文章,他把一个aspx页面在一个MVC应用程序。

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

您的控制器将无法获得ViewState属性。即使你确实想处理__VIEWSTATE的问题,你就必须做一些工作,为了得到它变成一个可用的形式在MVC控制器。就想出一个转换战略祝你好运,不管它是如何工作,很多人会有兴趣知道那样的问题,你会面对的过程。


0
投票

如果您在MVC页有一个以上的表格,您可以在表单中一个有意义的ID和测试添加一个隐藏的输入,如果它有一个值。这样,你不需要有两个单独的处理程序(一个get和一个后)。

所以INF页面和表单中:

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

而在控制器:

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

希望能帮助到你!


13
投票

没有的IsPostBack - 一切是POST或GET(或其他HTTP动词)。您可以限制HTTP动词,你的行动可以,即,你永远不会看到来自不允许动词的请求,使用AcceptVerbsAttribute。例如,以下只允许职位。

  [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()
  {
  }

编辑:请注意,我已经添加了防伪令牌验证的POST动作。你真的应该使用这protect against cross-site scripting attacks


9
投票

您可以使用这段代码在剃刀

@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;
 }

3
投票

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


1
投票

对于Asp.net核心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
投票

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

我给你的建议是,有两个分支:一个与你在哪里添加补丁的已知错误当前站点,另一个在那里你从头开始建立一个新的网站。新功能应该在这一个来实现。我认为大部分的代码库是可以重复使用的新网站。

当新的网站是准备好了,把它投入生产。


0
投票

为什么你想从一个控制器内获得价值?不知道这是否会帮助你,但你仍然可以使用传统的Request对象来获取被提交的表单信息...


0
投票

我不知道如果我理解正确你的问题,但在控制器上你就必须处理来自浏览器的第二动作的车把支柱初始GET操作。

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

 public ActionResult Create()
 {...}
© www.soinside.com 2019 - 2024. All rights reserved.