我知道,我知道,我知道。我不应该在MVC中做webforms,我完全同意。但是,签署我的薪水的人不会批准我们的网站现在完全转换为MVC。因此,我逐页采取增量步骤,在MVC中添加新功能时将其转换。
所以我的问题是如何从控制器访问IsPostBack属性?
编辑:为了进一步说明,我的mvc母版页上有一个webform用户控件,可以启动回发。我试图通过mvc帖子识别这些回发。在这一点上,我想我只是检查请求表单键的“__viewstate”键,如果它被发现将其视为回发。
答案 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 )
{
}
如果您需要具有相同的操作名称同时执行GET / 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应用程序中。
您的控制器无权访问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
}
希望它有所帮助!