изменить переменную asp.net после нажатия на ссылку действия - PullRequest
1 голос
/ 03 августа 2009

Я хочу изменить переменную ASP.NET, когда кто-то нажимает на ссылку на странице. В частности, переменная Session ["что-то"]. Это означает, что я должен делать это после обратной передачи, но я новичок во всей веб-разработке и, в частности, в ASP.NET MVC, поэтому я знаю только перегруженное действие с некоторым атрибутом [Accept]. Так как эта ссылка находится на главном сайте, я могу только представить, чтобы добавить такое действие к каждому существующему действию, и это кажется довольно неудачным. Javascript не имеет доступа к переменным ASP.NET, поэтому я довольно растерялся.

Эта ссылка на действие должна быть предназначена почти для каждого действия, и я не знаю, как распознать, был ли доступ к нему по этой спекулятивной или какой-либо другой ссылке (что важно для меня). Это подразумевает некоторую постобработку, что-то вроде


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

Есть идеи? Кусок кода?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 03 августа 2009
  1. Actionlink - это просто вспомогательный метод для создания tag. You pass it the controller and action you want, and it uses your routing table to determine how to build the href attribute.
  2. To do what you want, your controller will need to change the session variable.

So, if the fact that a controller has been called is enough to figure out what the new session variable should be, then that's easy -- simply change the session variable in the action.

However, it might be that you want different links to the same action to set different session variables. In that case, your actinlink might look something like this:

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

which causes something like this (depending on your route table):

 Click Me 

Итак, теперь вы должны установить переменную сеанса в вашем действии:

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

EDIT

Учитывая ваш комментарий, есть два способа сделать это: атрибут, украшающий контроллеры или главный контроллер. Я бы порекомендовал главный контроллер, поскольку вам, вероятно, будет проще его реализовать.

Поскольку вы не включили никаких конкретных примеров, я сделаю один. Именно здесь, независимо от того, какое действие вызывается, конкретная строка запроса приравнивается к определенному значению в сеансе, как для настройки языка.

Я собираюсь из памяти здесь, поэтому вам, возможно, придется немного поэкспериментировать (особенно с тем, где именно находятся объекты сеанса и запроса). Если нет, я могу посмотреть на мой код позже. Если у вас его еще нет, создайте главный контроллер, от которого получаются другие ваши контроллеры. Переопределить инициализацию (вызывая 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 голосов
/ 03 августа 2009

Вы могли бы использовать LinkButton и заставить его запускать функцию сервера

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

Тогда ваша серверная функция будет выглядеть примерно так:

protected void lkbChange_Click(Object sender, EventArgs e)
{
    Session["location"] = new_value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...