Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC-iPostBack还在吗?_Asp.net Mvc_Webforms - Fatal编程技术网

Asp.net mvc ASP.NET MVC-iPostBack还在吗?

Asp.net mvc ASP.NET MVC-iPostBack还在吗?,asp.net-mvc,webforms,Asp.net Mvc,Webforms,我知道,我知道,我知道。我完全同意,我不应该在MVC内部做webforms。但是,签署我工资支票的人现在不会批准将我们的网站完全转换为MVC。因此,我在MVC中添加新功能的同时,一页一页地逐步转换它们 所以我的问题是如何从控制器访问IsPostBack属性 编辑:为了进一步澄清,我在mvc母版页上有一个webform用户控件,可以启动回发。我正在尝试识别这些回帖和mvc帖子。此时,我想我只需检查请求表单键中的“\uuu viewstate”键,如果找到该键,则将其视为回发。控制器不会从Syste

我知道,我知道,我知道。我完全同意,我不应该在MVC内部做webforms。但是,签署我工资支票的人现在不会批准将我们的网站完全转换为MVC。因此,我在MVC中添加新功能的同时,一页一页地逐步转换它们

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


编辑:为了进一步澄清,我在mvc母版页上有一个webform用户控件,可以启动回发。我正在尝试识别这些回帖和mvc帖子。此时,我想我只需检查请求表单键中的“\uuu viewstate”键,如果找到该键,则将其视为回发。

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

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

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

当新站点准备好后,将其投入生产。

没有iPostBack——所有内容都是POST或GET(或其他HTTP动词)。您可以使用AcceptVerbsAttribute限制操作允许的HTTP谓词,也就是说,您永远不会看到来自不允许的谓词的请求。例如,以下仅允许发布

  [AcceptVerbs( HttpVerbs.Post )]
  [ValidateAntiForgeryToken]
  public ActionResult Update( int id )
  {
  }
如果您需要具有相同的操作名称do GET/POST,并且它们实际上执行不同的操作,那么您可以为它们提供单独的签名,或者使用actionname属性来别名其中一个操作,以便这些方法可以具有不同的名称

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

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


编辑:注意,我已将反伪造令牌验证添加到POST操作中。你真的应该用这个来解决这个问题。

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

我不确定是否正确理解了您的问题,但在控制器上,您将有一个操作来处理浏览器的初始get,另一个操作来处理帖子

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

 public ActionResult Create()
 {...}

我一定会看看Scott Hanselman的这篇博文,他在MVC应用程序中添加了一个aspx页面


您的控制器将无权访问ViewState属性。即使您确实希望处理uu VIEWSTATE的问题,您也必须做一些工作,以便将其转换为mvc控制器中的可用形式。祝你好运能想出一个转换策略,不管它如何运作,很多人都想知道你在转换过程中会遇到什么样的问题。

如果有人仍然感兴趣,你可以从MVC操作方法中测试一篇文章,如下所示:

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

}

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

因此,在页面和表单内部:

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

希望有帮助

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

@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}
我经常使用这个方法(在我的BaseController类上声明)


对于Asp.NETCore2.x,您可以在HttpRequest上创建一个扩展方法。基于@ibirite,答案可能是这样的:

使用系统;
使用System.Linq;
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.Http.Extensions;
名称空间MyApp
{
公共静态类HttpRequestExtensions
{
公共静态bool IsPostBack(此HttpRequest请求)
{
var currentUrl=UriHelper.BuildAbsolute(request.Scheme、request.Host、request.PathBase、request.Path、request.QueryString);
var Referer=request.Headers[“Referer”].FirstOrDefault();
bool isPost=string.Compare(request.Method,“POST”,
StringComparison.CurrentCultureIgnoreCase)=0;
if(referer==null)返回false;
bool isSameUrl=string.Compare(当前URL,
推荐人,
StringComparison.CurrentCultureIgnoreCase)=0;
返回isPost&&isSameUrl;
}
}
}

ASP.NET视图引擎视图确实继承自页面。实际上,混合使用mvc和webforms页面时,仍有回发。请参阅上面的编辑。
publicstaticboolispostback(这个HttpRequestBase请求){return\uu viewstate-something-something}
可能是最接近的。但是,在MVC母版页中放置Web表单用户控件可能会破坏未来版本的ASP.NET MVC。我们为什么不在MVC中使用Web表单呢?我正在使用网络表单。但我不专业。除了web表单,我们还可以使用什么?谢谢你,这正是你在MVC中所需要的方法!不惜一切代价避免这种情况。控制器代码应按方法组织。您的HttpGet方法ie[HttpGet]应该与[HttpPost]方法完全分开。这有很多原因,可测试性是其中之一,可读性等等。请参阅下面tvanfosson的答案。在2012+1中仍然有帮助。你说的“不惜一切代价避免这种情况”是什么意思?如果您想要一个javascript标志来决定是否执行脚本呢?没有其他方法可以做到这一点…-1:这不区分回发和AJAX帖子。
if (Request.Form["testForm"] != null)
        { 
        // ACTIONS FOR THE POSTED FORM
        }
@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}
 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;
 }