Как изменить один параметр строки запроса, возможно, с помощью управляющего действия? - PullRequest
0 голосов
/ 30 сентября 2011

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

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

На большинстве страниц веб-приложения у меня есть две ссылки (но их может быть и больше):

  • Вариант A
  • Вариант B

Это частичный вид, восстановленный действием контроллера.

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

Эти ссылки должны быть доступны почти на всех страницах, и они не предназначены для перенаправления на другую страницу, а только для того, чтобы хранить эту информацию где-то, чтобы ее можно было использовать повторно, когда действие должно фильтровать возвращаемое содержимое: место, всегда доступное в отношении текущий контроллер, действие или пользователь (включая неаутентифицированных пользователей) (сеанс «cookie»). Эта информация используется для фильтрации отображаемого содержимого во всем веб-приложении.

Итак, проблема не в том, как создать бизнес-логи этого, а в том, как (и где) хранить эту информацию:

  • без переписки со строкой запроса (означает: строка запроса должна быть максимально пустой / чистой)
  • без перенаправления на другие страницы (пользователь должен получить текущую страницу, просто с другим содержимым)
  • позволяют этой информации сохраняться между всеми представлениями, пока пользователь снова не нажмет, чтобы изменить параметр (ы)

Моя цель - сохранить эту информацию в модели, которая будет содержать все опции и статус их выбора (вкл / выкл), чтобы соответствующий PartialView знал, как их отображать. Кроме того, я мог бы отправить эту модель "вещи", которая будет обрабатывать изменения опций.

Спасибо.

UPDATE

Следуя совету Павла, я пошел по Сессии:

    private List<OptionSelectionModel> _userOptionPreferences;
    protected List<OptionSelectionModel> UserOptionPreferences
    {
        get
        {
            if (Session["UserOptionPreferences"] == null)
            {
                _userOptionPreferences= Lib.Options.GetOptionSelectionModelList();
            }
            else
            {
                _userOptionPreferences= Session["UserOptionPreferences"].ToString().Deserialize<List<OptionSelectionModel>>();
            }

            if (_userOptionPreferences.Where(g => g.Selected).Count() == 0)
            {
                foreach (var userOptionPreferencesin _userOptionPreferences)
                {
                    userOptionPreferences.Selected = true;
                }
            }

            UserOptionPreferences= _userOptionPreferences;
            return _userOptionPreferences;
        }
        private set
        {
            _userOptionPreferences= value;
            Session["UserOptionPreferences"] = _userOptionPreferences.SerializeObject();
        }
    }

После этого я переопределил (не уверен, что правильное сопряжение "переопределить" :) OnActionExecuting ():

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        GetOptionSelections();

        base.OnActionExecuting(filterContext);
    }

GetOptionSelections () ...

    private void GetOptionSelections()
    {
        if (String.IsNullOrEmpty(Request["optionCode"])) return;

        var newOptionCode = Request["optionCode "];
        foreach (var userOptionPreferencesin UserOptionPreferences)
        {
            if (userOptionPreferences.OptionCode == newOptionCode )
                userOptionPreferences.Selected = !userOptionPreferences.Selected;
        }
    }

Этот код, я думаю, может быть лучше, но сейчас я просто хочу, чтобы он работал, а он нет.

Может быть, есть и другие проблемы (вполне точно, на самом деле), но я считаю, что основная проблема заключается в том, что OnActionExecuting вызывается каждым действием в контроллере, который наследуется от BaseController, поэтому он продолжает переключать userOptionPreferences.Selected on / off, но я не знаю, как заставить GetOptionSelections () вызываться только один раз в каждом представлении: что-то вроде старого Page_Load, но для MVC.

Последнее обновление решения AKA Хорошо, используя сеанс, мне удалось сохранить эту информацию.

Другая проблема не касалась этого вопроса, и мне удалось решить ее, создав новое действие, которое позаботится об обработке изменения параметра, а затем перенаправит на URL вызывающего абонента (используя обычный параметр returnUrl, но как параметр действия). Таким образом, изменение опции выполняется только один раз за звонок.

Единственное, что мне не очень нравится, это то, что я не могу просто работать со свойством UserOptionPreferences, так как оно не меняет значение сеанса, а только значение в памяти, поэтому я должен установить свойство с каждый раз статус нового объекта: не имеет большого значения, но и не очень приятно.

1 Ответ

1 голос
/ 30 сентября 2011

Это место для использования сессии.

Сеанс будет сохранять ваши настройки между запросами, оставляя их вне строки запроса url. Похоже, вы уже пробовали это, но попробуйте еще раз, и если у вас есть проблемы, спросите еще раз. Я думаю, что это будет лучший способ решить эту проблему.

...