我想在有人点击页面上的链接时更改ASP.NET变量。特别是Session [“something”]变量。这意味着我应该在回发后执行此操作,但我不熟悉整个Web开发和ASP.NET MVC,所以我只知道一个带有一些[Accept]属性的重载操作。由于此链接位于主站点上,因此我可以想象只为现有的每个操作添加此类操作,这看起来非常不幸。 Javascript无法访问ASP.NET变量,所以我很遗憾。
此操作链接应该适用于几乎所有操作,我不知道,如何识别,是否已通过此spoecific或其他链接访问(这对我很重要)。这意味着一些后期处理,如
<a href="" onclick="<% Session["location"] = new_value %>" >
有什么想法吗?一段代码?
提前致谢。
答案 0 :(得分: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;
....
修改强>:
考虑到您的评论,有两种方法可以解决这个问题:装饰控制器或主控制器的属性。我建议使用主控制器,因为它可能是最容易实现的。
由于你没有包含任何具体的例子,我会提出一个例子。无论调用哪个动作,特定的查询字符串都等于会话中的特定值,就像设置语言一样。
我要从内存开始,所以你可能需要进行一些实验(尤其是会话和请求对象的确切位置)。如果没有,我可以稍后查看我的代码。如果您还没有,请创建其他控制器派生自的主控制器。覆盖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)
您可以使用LinkButton并使其启动服务器功能
<asp:LinkButton ID="lkbChange" runat="server" OnClick="lkbChange_Click" />
然后您的服务器端功能将如下所示:
protected void lkbChange_Click(Object sender, EventArgs e)
{
Session["location"] = new_value;
}