我知道,我知道,我知道。我不应该这样做MVC的内部web表单,我完全同意。但是,谁签我的薪水的人不会马上批准我们的网站,MVC完全转化。所以我采取渐进的步骤,一页一页,将它们转换了,而在MVC增加新的功能。
所以我的问题是如何从一个控制器访问IsPostBack属性?
编辑:为了进一步澄清,我有我的MVC母版页上一个WebForm用户控制,可以启动回发。我试图找出这些经文回发一个MVC职位。在这一点上,我认为我会只是检查申请表键为“__VIEWSTATE”键,如果它的发现把它作为一个回传。
在任何情况下,仍然有兴趣,你可以测试从里面像这样的MVC操作方法一个POST:
if (Request.HttpMethod=="POST") {
}
我肯定会看看由Scott Hanselman在这篇博客文章,他把一个aspx页面在一个MVC应用程序。
您的控制器将无法获得ViewState属性。即使你确实想处理__VIEWSTATE的问题,你就必须做一些工作,为了得到它变成一个可用的形式在MVC控制器。就想出一个转换战略祝你好运,不管它是如何工作,很多人会有兴趣知道那样的问题,你会面对的过程。
如果您在MVC页有一个以上的表格,您可以在表单中一个有意义的ID和测试添加一个隐藏的输入,如果它有一个值。这样,你不需要有两个单独的处理程序(一个get和一个后)。
所以INF页面和表单中:
<input type="hidden" id="testForm" name="testForm" value="1"/>
而在控制器:
if (Request.Form["testForm"] != null)
{
// ACTIONS FOR THE POSTED FORM
}
希望能帮助到你!
没有的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。
您可以使用这段代码在剃刀
@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}
我经常用这个方法(在我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;
}
控制器不从System.Web.UI.Page继承。没有IsPostBack属性。
对于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;
}
}
}
MVC框架并不支持经典回传和视图状态在Web表单中使用。所以,不,你没有访问的IsPostBack。
我给你的建议是,有两个分支:一个与你在哪里添加补丁的已知错误当前站点,另一个在那里你从头开始建立一个新的网站。新功能应该在这一个来实现。我认为大部分的代码库是可以重复使用的新网站。
当新的网站是准备好了,把它投入生产。
为什么你想从一个控制器内获得价值?不知道这是否会帮助你,但你仍然可以使用传统的Request对象来获取被提交的表单信息...
我不知道如果我理解正确你的问题,但在控制器上你就必须处理来自浏览器的第二动作的车把支柱初始GET操作。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(MyModel model)
{...}
public ActionResult Create()
{...}