2014-09-04 2 views
0

현재 활성 거주자를 기반으로보기를 반환하려하지만 작동하지 않습니다. 어떤 이유로 테넌트 사이트의 이름을 포함해야하더라도 이름은 비어 있습니다. 여기 내 코드는 다음과 같습니다.Orchard CMS의 ShellSettings를 사용하여 현재/활성 거주자 이름 가져 오기

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Orchard.Themes; 
using Orchard.Environment.Configuration; 

namespace Speedbump.Controllers 
{ 
    public class SpeedBumpController : Controller 
    { 
     [Themed] 
     public ActionResult Index(ShellSettings settings) 
     { 
      //Initialize Variables 
      string requestedURL = ""; 
      string finalRequestedURL = ""; 
      bool wasValidURL = false; 

      //Grab the query string parameters and put them into variables to be used later 
       //Requested URL 
       requestedURL = Request.QueryString["url"]; 

      //Remove "http://" or "https://" from the Requested URL (if it exists) 
      if (requestedURL.IndexOf("http") > -1) 
      { 
       finalRequestedURL = requestedURL.Replace("http://", ""); 
      } 
      else if (requestedURL.IndexOf("https") > -1) 
      { 
       finalRequestedURL = requestedURL.Replace("https://", ""); 
      } 
      else 
      { 
       finalRequestedURL = requestedURL; 
      } 

      //Create a list of strings to contain all the "valid" URLs 
      var whiteList = new List<string>(); 

      //Add URLs to the list 
      whiteList.Add("www.google.com"); 
      whiteList.Add("www.gmail.com"); 

      //Loop through each URL in the list of Valid URLs checking against the finalRequestedURL 
      foreach (string validURL in whiteList) 
      { 
       if (finalRequestedURL == validURL) 
       { 
        wasValidURL = true; 
        break; 
       } 
       wasValidURL = false; 
      } 

      //ViewBag Items 
      ViewBag.wasValidURL = wasValidURL; 
      ViewBag.requestedURL = finalRequestedURL; 
      ViewBag.tenantName = settings.Name; 

      //Return a different view depending on whether or not the url is valid 
      if (wasValidURL) 
      { 
       if (!string.IsNullOrEmpty(settings.Name)) 
       { 
        return View(settings.Name + "ValidURL"); 
       } 
       else 
       { 
        return View("ValidURL"); 
       } 

      } 
      else 
      { 
       if (!string.IsNullOrEmpty(settings.Name)) 
       { 
        return View(settings.Name + "InvalidURL"); 
       } 
       else 
       { 
        return View("InvalidURL"); 
       } 
      } 
     } 
    } 
} 

어떤 도움을 주시면 감사하겠습니다. 고맙습니다.

답변

1

이것은 의존성 주입이 작동하는 방식이 아닙니다. action 매개 변수를 통해 주입하지 않고 생성자 매개 변수를 통해 주입합니다. 그것이 첫 번째 문제입니다.

두 번째 문제는 ShellSettings을 삽입하지 말고 IWorkContextAccessor을 입력 한 다음 .GetContext().CurrentSite을 입력하여 사이트 설정을 가져 오는 것입니다.

귀하의 질문에 답을 해주셔야하지만 귀하의 코드에도 다른 문제가 있습니다.

예를 들어, 쿼리 문자열에 액세스하면 안됩니다. 대신 액션 매개 변수를 사용하고 프레임 워크에서 모델 바인딩을 수행하도록하십시오.

바로 뒤에 URL의 어느 곳에서나 "http"를 테스트하면 오 탐지가 발생하고 "https"도 catch하므로 다른 사람에게 절대 도달하지 않습니다. 대신 StartsWith과 "http : //"를 사용하십시오.

그런 다음 Replace을 사용하지 마십시오. URL이 "http : //"로 시작한다는 것을 알고 있다면 SubString(7)을 사용할 수 있습니다.

코드에서 화이트리스트를 하드 코딩하지 마십시오. 대신 구성 가능하도록 만드십시오.

불필요한 루프를 작성하는 대신 Contains을 사용하는 방법을 학습하십시오.

여기서 ViewBag을 사용하지 마십시오 : 좋은 이유가없는 것 같습니다.

조회수 대신 리디렉션 결과가 반환되는 것으로 보입니다.

+0

@ Bertrand Le Roy 도움을 주셔서 감사합니다. 저를위한 몇 가지 것을 명확히 해 주시겠습니까? 화이트리스트를 구성 가능하게 만들려면 어떻게해야합니까? 나는 더 나은 선택으로 그것을하고 있었지만 그것을 달성하는 방법을 생각할 수 없었다. 또한 querystring에 액세스하는 대신 "action parameters"를 사용하는 방법은 무엇입니까? 모든 도움을 주셔서 다시 한 번 감사드립니다. – EmeraldArcher

+0

죄송합니다. SiteSettings 콘텐트 부분에 새 콘텐트를 추가하면 관리 사용자가 허용 목록에 들어가는 URL 수를 입력하고 사이트 이름에 액세스하는 것과 같은 방법으로 허용 목록에 액세스 할 수 있습니까? – EmeraldArcher

+0

구성 가능하도록 설정 : 사이트 설정을 지정합니다 (단, 알아 냈습니다.). 액션 매개 변수 : 액션에'string url' 매개 변수가 있습니다. –

관련 문제