2011-09-30 5 views
0

지난 3 일 동안 나는 간단한 것을 해야겠다고 생각했던 것을 성취 할 수있는 방법을 찾기 위해 애썼다. 이 작업을 독자적으로 수행하거나 웹에서 솔루션을 검색하는 것은 도움이되지 않았습니다. 어쩌면 내가 조사 할 때 무엇을 찾을 지조차 모르니까. 나는 내가 할 수있는만큼 설명하려고 노력한다. 어쩌면 누군가 나를 도울 수있을 것이다.제어 동작을 통해 단일 쿼리 문자열 매개 변수를 변경하는 방법?

나는 여러 가지 방법으로 시도했기 때문에 나는 그것을 어떻게하는지 말하지 않을 것이다. 그리고 그들 중 누구도 다른 이유로 인해 일하지 않았기 때문에 나는 당신에게서 신선한 조언을보기를 더 좋아한다.

  • 옵션 A
  • 옵션 B

이것은 부분보기 :

웹 응용 프로그램의 대부분의 페이지에서

, 나는 (그러나 그들은 더 많은 수) 같은 두 개의 링크가 , 컨트롤러 동작에 의해 보류.

사용자는 값을 모두 선택하거나 둘 다 선택할 수는 없지만 적어도 하나는 항상 선택되어야 함을 의미합니다.

이러한 링크는 거의 모든 페이지에서 액세스 할 수 있어야하며 다른 페이지로 리디렉션되지 않아야하며,이 정보를 어딘가에 저장하고 작업에서 반환 된 콘텐츠를 필터링해야 할 때 다시 사용할 수 있어야합니다. 현재 컨트롤러, 액션 또는 사용자 (인증되지 않은 사용자 포함) (세션? 쿠키?) 이 정보는 전체 웹 응용 프로그램에 표시된 내용을 필터링하는 데 사용됩니다./빈으로 쿼리 문자열을 유지 : 쿼리 문자열로 (수단을 엉망으로하지 않고

  • :

    그래서, 문제는의 비즈니스 LOGI를 만드는 방법을하지만,이 정보를 저장하는 방법 (어디) 아니다 사용자가 클릭 다시 옵션 (들)

  • 을 변경할 때까지,
  • 이 정보가 모든보기 사이를 지속 할 수 있습니다 (사용자가 단지 다른 내용으로, 현재 페이지를 받아야합니다) 다른 페이지로 리디렉션없이
  • ) 가능한 한 깨끗한

내 목표는 모든 옵션과 선택 상태 (on/off)를 포함 할 모델에이 정보를 저장하는 것이므로 PartialView는이를 표시하는 방법을 알 수 있습니다. 또한이 모델을 옵션 변경 사항을 처리 할 "물건"에 보낼 수 있습니다.

감사합니다.

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(); 
     } 
    } 

이에 따라, 나는 무시했다 (확실하지 "무시하는"의 오른쪽 활용은 다음과 같습니다 바울의 조언에 따라

UPDATE

, 나는 세션의 길을 갔다했습니다 :) 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에서 상속받은 컨트롤러의 각 동작에 의해 호출되므로 사용자가 OnOptionExputing을 On/Off로 토글 링합니다. ,하지만 각보기에서 한 번만 호출되는 GetOptionSelections()를 만드는 방법을 모르겠습니다. 이전 Page_Load와 비슷하지만 MVC에 대한 것입니다.

마지막 업데이트 AKA 솔루션 좋아요, 세션 방법을 사용하면이 정보를 저장할 수있었습니다.

다른 문제는이 질문과 관련된 주제가 아니며 옵션 변경 사항을 처리하는 데 신경을 쓰는 새로운 작업을 생성 한 다음이를 해결하여 호출자 URL로 리디렉션합니다 (일반적인 returnUrl 매개 변수 사용, 액션 매개 변수로서). 이렇게하면 옵션 변경은 호출 당 한 번만 수행됩니다.

내가 좋아하지 않는 유일한 점은 세션 값을 변경하지 않고 메모리의 값만 변경하기 때문에 UserOptionPreferences 속성으로 작업 할 수 없다는 점입니다. 속성을 설정해야합니다. 매번 새로운 객체의 상태와 함께 : 큰 거래는 아니지만 좋은 것도 아닙니다.

+0

코드가 어떤 언어인지 모르겠지만 더 이상 도울 수 없습니다. 이 질문이 답변으로 선택되면 새로운 질문에 대한 도움을 얻으실 수있을 것입니다. 행운을 빕니다! – Paul

+0

이것은 C#이며 문제로 유감스럽게 생각합니다. 실수로 답변을 표시했습니다. –

답변

1

세션을 사용할 장소입니다.

세션은 url 쿼리 문자열을 벗어나지 않도록 요청간에 설정을 유지합니다. 아마도 이미 시도해 보았지만 다시 시도해보십시오. 문제가있을 경우 다시 질문하십시오. 나는 이것이 당신이이 문제를 해결할 수있는 최선의 방법이라고 생각합니다.

관련 문제