单击操作链接后更改asp.net变量

时间:2009-08-02 23:42:10

标签: asp.net-mvc

我想在有人点击页面上的链接时更改ASP.NET变量。特别是Session [“something”]变量。这意味着我应该在回发后执行此操作,但我不熟悉整个Web开发和ASP.NET MVC,所以我只知道一个带有一些[Accept]属性的重载操作。由于此链接位于主站点上,因此我可以想象只为现有的每个操作添加此类操作,这看起来非常不幸。 Javascript无法访问ASP.NET变量,所以我很遗憾。

此操作链接应该适用于几乎所有操作,我不知道,如何识别,是否已通过此spoecific或其他链接访问(这对我很重要)。这意味着一些后期处理,如


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

有什么想法吗?一段代码?

提前致谢。

2 个答案:

答案 0 :(得分:2)

  1. actionlink只是一个帮助方法来创建一个&lt; a href =“... 标签。你传递了你想要的控制器和动作,它使用你的路由表来确定如何构建href属性。
  2. 要执行您想要的操作,您的控制器将需要更改会话变量。
  3. 因此,如果已经调用控制器的事实足以弄清楚新的会话变量应该是什么,那么这很容易 - 只需更改操作中的会话变量。

    但是,您可能希望使用相同操作的不同链接来设置不同的会话变量。在这种情况下,您的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;
            .... 
    

    修改

    考虑到您的评论,有两种方法可以解决这个问题:装饰控制器或主控制器的属性。我建议使用主控制器,因为它可能是最容易实现的。

    由于你没有包含任何具体的例子,我会提出一个例子。无论调用哪个动作,特定的查询字符串都等于会话中的特定值,就像设置语言一样。

    我要从内存开始,所以你可能需要进行一些实验(尤其是会话和请求对象的确切位置)。如果没有,我可以稍后查看我的代码。如果您还没有,请创建其他控制器派生自的主控制器。覆盖initialize(在其中调用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"];
        }
    

    詹姆斯

答案 1 :(得分:0)

您可以使用LinkBut​​ton并使其启动服务器功能

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

然后您的服务器端功能将如下所示:

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