ASP.NET MVC - IsPostBack还在吗?

chi*_*ef7 16 asp.net-mvc webforms

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

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

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

小智 44

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

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

}
Run Code Online (Sandbox Code Playgroud)

  • 你是什​​么意思"不惜一切代价避免这种情况"?如果你想要一个javascript标志是否执行脚本怎么办?没有别的方法可以做到这一点...... (5认同)
  • 避免所有费用.您的控制器代码应按方法组织.你的HttpGet方法,即[HttpGet]应该与你的[HttpPost]方法完全分开.这有很多原因,可测性是一个,可读性等.请参阅下面的tvanfosson的答案. (4认同)

tva*_*son 13

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

  [AcceptVerbs( HttpVerbs.Post )]
  [ValidateAntiForgeryToken]
  public ActionResult Update( int id )
  {
  }
Run Code Online (Sandbox Code Playgroud)

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

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

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

要么

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

  [AcceptVerbs( HttpVerbs.Post )]
  [ValidateAntiForgeryToken]
  public ActionResult List()
  {
  }
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,我已将防伪令牌验证添加到POST操作中.您真的应该使用它来防止跨站点脚本攻击.


小智 10

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

@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*ert 3

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

  • ASP.NET 视图引擎视图继承自 Page。 (2认同)