2009-02-05 4 views
7

Stackoverflow 로그인/로그 아웃 링크의 returnurl URL 매개 변수가 이스케이프 처리되지 않았지만 경로에 매개 변수로 경로를 추가하려고 시도 할 때 이스케이프 처리됩니다.URL 매개 변수를 ASP.NET MVC에서 이스케이프 처리하지 않으려면 어떻게해야합니까?

그래서/login? returnurl =/questions/ask shows/login? returnurl = % 2fquestions % 2fask 그리고 추한 것 같습니다. returnurl 값을 벗어나지 않게하려면 어떻게해야합니까?

는 여기에 내가 코드에서 뭘하는지의 : 비슷한 문제는 내 자신의 확장을 작성했다

Html.ActionLink("Login", "Login", "Account", new { returnurl=Request.Path }, null) 
+0

이것에 대한 답을 알고 싶습니다. –

답변

1

이유에 따라 발생하는 인코딩에 대한 의견 중 하나를 이해합니다. 이것은 예외 일 뿐이며 규칙은 아닙니다.

다음은 내가 어떻게 조합했는지, 어떻게 향상시킬 수 있습니까?

public static string ActionLinkNoEscape(this HtmlHelper html, string linkText, string actionName, string controllerName, object values, object htmlAttributes) 
    { 
     RouteValueDictionary routeValues = new RouteValueDictionary(values); 
     RouteValueDictionary htmlValues = new RouteValueDictionary(htmlAttributes); 

     UrlHelper urlHelper = new UrlHelper(html.ViewContext.RequestContext, RouteTable.Routes); 
     string url = urlHelper.Action(actionName, controllerName); 
     url += "?"; 
     List<string> paramList = new List<string>(); 
     foreach (KeyValuePair<string, object> pair in routeValues) 
     { 
      object value = pair.Value ?? ""; 
      paramList.Add(String.Concat(pair.Key, "=", Convert.ToString(value, CultureInfo.InvariantCulture))); 
     } 
     url += String.Join("&", paramList.ToArray()); 

     TagBuilder builder = new TagBuilder("a"); 
     builder.InnerHtml = string.IsNullOrEmpty(linkText) ? "" : HttpUtility.HtmlEncode(linkText); 
     builder.MergeAttributes<string, object>(htmlValues); 
     builder.MergeAttribute("href", url); 
     return builder.ToString(TagRenderMode.Normal); 
    } 
+0

MvcHtmlString을 반환하면 조금 더 좋아집니다. –

0

내 solutionto. 코드를 파고 들자면 나는 그렇지 않은 방법을 찾을 수 없었다. 네가 이렇게 생겼을거야.

public static class HtmlHelperExtensions 
{ 
    public static string LoginLinkWithReturnUrl(this HtmlHelper helper, 
               string linkText, 
               string action, 
               string controller, 
               string returnUrl, 
               object htmlAttributes) 
    { 
     TagBuilder builder = new TagBuilder("a"); 
     builder.Attributes.Add("href", 
            string.Format("/{0}/{1}?returnurl={2}", 
               controller, 
               action, 
               returnUrl)); 
     var attrDict = new RouteValueDictionary(htmlAttributes); 
     builder.MergeAttributes(attrDict); 
     builder.InnerHtml = linkText; 
     return builder.ToString(); 
    } 
} 

나는 동일한 문제를 만들고 UrlHelper를 사용하여 string.Format 메커니즘을 대신 사용했다고 생각합니다. YMMV.

+0

유일한 문제는 경로를 하드 코딩한다는 것입니다. 즉, 기본 경로를 사용하지 않으면이 경로가 중단됩니다. – JMS

+0

그것은 내 머리 꼭대기에있는 예일뿐입니다. 아마도 UrlHelper를 사용하여 액션/컨트롤러에서 경로를 작성한 다음 쿼리 매개 변수를 끝에 추가 할 수 있습니다. – tvanfosson

6

어떻게 그것이 returnurl 값

어떻게 이런 일에 관하여 탈출하지받을 수 있나요?

var url = Url.Action("Login", "Account", new {returnurl = Request.Path}); 
var unEncodedUrl = HttpUtility.UrlDecode(url); 
Response.Write("<a href='" + unEncodedUrl + "'>...</a>"); 

그게 당신이 비록 원하는 무엇을해야

, URL encoding has its purpose.

+1

빠른 솔루션. JS 콘텐츠를 만드는 경우 @ Html.Raw (unEncodedUrl)을 사용해야 할 수도 있습니다. –

0

내가 프레임 워크에 내장 주위에 방법이 생각하지 않습니다. URL의 실제 생성은 System.Web.Routing.ParsedRoute.Bind 메서드에서 발생하며 이스케이프를 방지하는 데 사용되는 조건은 없습니다.

확장 방법처럼 보이는 방법은 이전에 언급 한 것보다 약간 더 강력한 방법입니다.

1

매개 변수는 하지 이스케이프입니다. URL이 :

http://stackoverflow.com/users/login?returnurl=%2fquestions%2fask 

이 실제로 작동하는 것을 알 수 있습니다. - 그래서 평소와 같이 매개 변수를 읽고 언 이스케이프 처리 중입니다. 매개 변수에 '&'과 같은 다른 범위를 벗어나는 문자를 포함 시키려면 이스케이프해야합니다.

트릭은 특히 '/'문자가 쿼리 매개 변수에서 % 이스케이프 처리 될 필요가 없다는 것입니다. 이 경로 부분과 같은 다른 상황에서 이스케이프 처리되어야하므로 URLEncode는 항상 안전하게 인코딩하기 위해 URLEncode를 인코딩합니다.

URL을 더 예쁘게 보이게하려면 정상적으로 매개 변수를 이스케이프 처리하면됩니다 (올바르게 처리해야하는 다른 모든 문자를 이스케이프 처리해야 함). '% 2f'에 문자열을 바꿉니다. '/'.

+0

URL은 작동하지만 모양이 마음에 들지 않습니다. 제프와 승무원이 같은 방식으로 느꼈습니다. 이 솔루션은 너무 많은 해킹입니다. – Todd

+0

매개 변수에서 % 2F 만 이스케이프 처리하면 유효한 URL로 유지됩니다. 위의 코드는 매개 변수에서 유효하지 않은 다른 문자로 넘어갑니다 (예 : 또는 %. – bobince

+0

내가 말했듯이, 그것은 예외이며 규칙이 아닙니다. – Todd

관련 문제