2009-04-22 41 views
13

我知道,我知道,我知道。我不應該在MVC裏面做webforms,我完全同意。但是,簽署我薪水的人不會批准我們的網站現在完全轉換爲MVC。所以我正在逐步採取增量步驟,在MVC中添加新功能的同時將它們轉換。ASP.NET MVC - IsPostBack還在嗎?

所以我的問題是如何從控制器訪問IsPostBack屬性?

編輯:爲了進一步闡明,我在我的mvc母版頁上有一個可以啓動回發的webform用戶控件。我試圖找出這些回發經文mvc帖子。在這一點上,我想我只是檢查一個「__viewstate」鍵的請求表單鍵,如果它發現將它視爲回發。

+0

'公共靜態布爾的IsPostBack(這HttpRequestBase要求){回報__viewstate-something-something}「可能是最接近的。但將MVC主頁中的Web窗體用戶控件放在ASP.NET MVC的未來版本中可能會中斷。 – bzlm 2010-04-04 21:18:25

+0

爲什麼我們不能在MVC中使用Web表單?我正在使用網頁表單。但我不專業。除了web表單,我們還可以使用其他什麼? – 2018-03-09 14:09:41

回答

3

控制器不從System.Web.UI.Page繼承。沒有isPostback屬性。

+1

ASP.NET視圖引擎視圖從頁面繼承。 – 2009-04-22 13:49:40

+2

我站好了。意見呢。控制器不。 – 2009-04-22 19:46:36

0

MVC框架不支持Web窗體中使用的經典回發和視圖狀態。所以,不,您無權訪問IsPostBack。

我對你的建議是有兩個分支:一個與當前網站,你爲已知錯誤添加補丁,另一個從頭開始構建新網站。新功能應該在這一個中實現。我假設你的大部分代碼庫都可以在新的站點中重用。

當新網站準備就緒時,將其投入生產。

13

沒有IsPostBack - 一切都是POST或GET(或其他HTTP動詞)。您可以限制您的操作允許的HTTP動詞,即使用AcceptVerbsAttribute,您永遠不會看到來自不允許的動詞的請求。例如,以下僅允許POST。

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

OR

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

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

編輯:請注意,我已經添加了防僞令牌驗證的POST動作。你真的應該使用這個到protect against cross-site scripting attacks

0

你爲什麼試圖從控制器中獲取該值?不知道這是否會幫助你,但你仍然可以使用傳統的請求對象來獲取由一個表單提交的信息...

0

我不知道如果我正確理解你的問題,但在控制器上會有一個操作來處​​理來自瀏覽器的初始GET和第二個操作來處​​理POST。

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

public ActionResult Create() 
{...} 
0

我肯定會看看Scott Hanselman的這篇博客文章,他將一個aspx頁面放在MVC應用程序中。

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

您的控制器將無法獲得ViewState屬性。即使您確實想要處理__VIEWSTATE的問題,您也必須做一些工作才能將其轉換爲mvc控制器中的可用表單。祝好運,提出轉換策略,不管它如何運作,許多人都會有興趣知道你在這個過程中會遇到的種種問題。

32

如果有些人依然有興趣,你可以測試從內部的MVC操作方法是這樣一個POST:

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

} 
0

如果您在MVC頁有一個以上的表格,你可以添加一個隱藏在表單中輸入一個有意義的ID並測試它是否有值。這樣你就不需要有兩個單獨的處理程序(一個用於獲取,另一個用於發佈)。

所以INF頁面和表單內:

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

和Controller:

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

希望它能幫助!

7

您可以使用這段代碼在剃刀

@if(IsPost) 
{ 
//dosomething 
} 
else 
{ 
//do some other thing 
} 
3

我經常用這個方法(在我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; 
}