2009-08-02 62 views
1

我想在有人單擊頁面上的鏈接時更改ASP.NET變量。特別是一個Session [「something」]變量。這意味着我應該在回發之後執行該操作,但是我對整個Web開發和ASP.NET MVC有所瞭解,所以我只知道一些帶有[Accept]屬性的重載操作。由於此鏈接位於主站點上,因此我可以想象僅爲每個現有操作添加這樣的操作,這似乎很不幸。 Javascript無法訪問ASP.NET變量,所以我很迷茫。單擊動作鏈接後更改一個asp.net變量

這個動作鏈接應該適用於幾乎所有的動作,我不知道如何識別它是否被這個spoecific或其他鏈接訪問(這對我很重要)。這意味着一些後處理,如


<a href="" onclick="<% Session["location"] = new_value %>" > 

任何想法?一段代碼?

在此先感謝。

回答

2
  1. 一個ActionLink的只是一種輔助方法,創建一個< a href =「...」標記,您將它傳遞給您想要的控制器和操作,並使用您的路由表來確定如何操作b使用href屬性。
  2. 要做你想做的事,你的控制器需要改變會話變量。

因此,如果控制器已被調用的事實足以確定新會話變量應該是什麼,那麼很簡單 - 只需更改操作中的會話變量即可。

但是,您可能想要通過不同的鏈接指向同一個操作來設置不同的會話變量。在這種情況下,你的actinlink可能是這個樣子:

<%= Html.ActionLink("Click Me", "action_name", "controller", new {session="new_value"}) %> 

這會導致這樣的事情(取決於您的路由表):

<a href="/controller/action_name?session=new_value">Click Me</a> 

所以,現在你必須設置你的會話變量在你的動作:

public ActionResult action_name(string session) 
    { 
     Session["val"] = session; 
     .... 

編輯

考慮到您的評論,有兩種方法可以解決這個問題:裝飾控制器或主控制器的屬性。我建議主控制器,因爲它可能是最容易實現的。

既然你沒有包括任何具體的例子,我會做一個。無論哪個動作被調用,它都在哪裏,特定的查詢字符串等同於會話中的特定值,例如設置語言。

我從這裏回憶,所以你可能不得不嘗試一下(尤其是會話和請求對象在哪裏)。如果沒有,我可以稍後再看看我的代碼。如果您還沒有,請創建一個其他控制器派生自的主控制器。重寫初始化(在其中調用base.Initialize)。再看看的查詢字符串,如:

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     if (requestContext.Current.Request["language"]) 
      requestContext.Current.Session["language"] = HttpContext.Current.Request["language"]; 
    } 

詹姆斯

0

你可能使用一個LinkBut​​ton並將其火服務器功能

<asp:LinkButton ID="lkbChange" runat="server" OnClick="lkbChange_Click" /> 

那麼你的服務器端功能會是這個樣子:

protected void lkbChange_Click(Object sender, EventArgs e) 
{ 
    Session["location"] = new_value; 
} 
+0

我可以將參數傳遞給服務器功能?在代碼中該函數應該在哪裏存在?在View的代碼後面? – Trimack 2009-08-03 08:07:25

+0

這個答案適用於ASP.NET。問題是關於事件概念不存在的ASP.NET MVC。 – 2009-08-03 12:06:12