Asp.Net MVC ActionLink, RedirectToAction 등을 사용할 때 조각 식별자를 포함하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/5628

  •  08-06-2019
  •  | 
  •  

문제

일부 링크에 조각 식별자가 포함되기를 원합니다.이 사이트의 일부 URL과 같습니다.

디버깅:IE6 + SSL + AJAX + 게시 양식 = 404 오류#5626

MVC에 내장된 메소드를 사용하여 이를 수행할 수 있는 방법이 있습니까?아니면 내 자신의 HTML 도우미를 굴려야 합니까?

도움이 되었습니까?

해결책

우리는 다음 릴리스에 이에 대한 지원을 포함시키는 것을 검토하고 있습니다.

다른 팁

Brad Wilson이 쓴 것처럼 간단히 문자열을 연결하여 뷰에 자신만의 링크를 구축할 수 있습니다.그러나 RedirectToAction(또는 이와 유사한 것)을 통해 생성된 리디렉션에 조각 이름을 추가하려면 다음과 같은 것이 필요합니다.

public class RedirectToRouteResultEx : RedirectToRouteResult {

    public RedirectToRouteResultEx(RouteValueDictionary values)
        : base(values) {
    }

    public RedirectToRouteResultEx(string routeName, RouteValueDictionary values)
        : base(routeName, values) {
    }

    public override void ExecuteResult(ControllerContext context) {
        var destination = new StringBuilder();

        var helper = new UrlHelper(context.RequestContext);
        destination.Append(helper.RouteUrl(RouteName, RouteValues));

        //Add href fragment if set
        if (!string.IsNullOrEmpty(Fragment)) {
            destination.AppendFormat("#{0}", Fragment);
        }

        context.HttpContext.Response.Redirect(destination.ToString(), false);
    }

    public string Fragment { get; set; }
}

public static class RedirectToRouteResultExtensions {
    public static RedirectToRouteResultEx AddFragment(this RedirectToRouteResult result, string fragment) {
        return new RedirectToRouteResultEx(result.RouteName, result.RouteValues) {
            Fragment = fragment
        };
    }
}

그런 다음 컨트롤러에서 다음을 호출합니다.

return RedirectToAction("MyAction", "MyController")
       .AddFragment("fragment-name");

그러면 URL이 올바르게 생성됩니다.

MVC3(그리고 이전에는 확인하지 않았을 수도 있음)에서는 조각 매개 변수를 전달하는 UrlHelper.GenerateUrl을 사용할 수 있습니다.다음은 기능을 래핑하는 데 사용하는 도우미 메서드입니다.

public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues)
{
    return UrlHelper.GenerateUrl(
        routeName: null,
        actionName: actionName,
        controllerName: controllerName,
        routeValues: new System.Web.Routing.RouteValueDictionary(routeValues),
        fragment: fragment,
        protocol: null,
        hostName: null,
        routeCollection: url.RouteCollection,
        requestContext: url.RequestContext,
        includeImplicitMvcValues: true /*helps fill in the nulls above*/
    );
}

@도미니크,

나는 그것을 경로에 넣으면 라우팅 문제가 발생할 것이라고 거의 확신합니다.

@리키,

MVC가 이를 지원할 때까지 경로를 만드는 방법에 대해 좀 더 "구식"이 될 수 있습니다.예를 들어 다음을 변환할 수 있습니다.

<%= Html.ActionLink("Home", "Index") %>

안으로:

<a href='<%= Url.Action("Index") %>#2345'>Home</a>

또는 본질적으로 동일한 작업을 수행하는 도우미를 직접 작성할 수도 있습니다.

짧은 대답은 다음과 같습니다.아니요.ASP.NET MVC Preview 3에는 작업 링크에 앵커를 포함하는 최고의 방법이 없습니다.Rails의 url_for :anchor와 달리 UrlHelper.GenerateUrl(및 이를 사용하는 ActionLink, RedirectToAction 등)에는 앵커를 인코딩할 수 있는 마법 속성 이름이 없습니다.

당신이 지적했듯이, 당신은 스스로 굴릴 수 있습니다.이것은 아마도 가장 깨끗한 솔루션 일 것입니다.

해킹적으로는 경로에 앵커를 포함하고 매개변수 해시에 값을 지정할 수 있습니다.

routes.MapRoute("WithTarget", "{controller}/{action}/{id}#{target}");
...
<%= Html.ActionLink("Home", "Index", new { target = "foo" })%>

그러면 /Home/Index/#foo와 같은 URL이 생성됩니다.불행하게도 이는 URL 끝에 표시되는 URL 매개변수와 잘 작동하지 않습니다.따라서 이 해킹은 모든 매개변수가 URL 경로 구성요소로 나타나는 매우 간단한 상황에서만 실행 가능합니다.

이것은 클라이언트 측 솔루션이지만 jquery를 사용할 수 있는 경우 다음과 같은 작업을 수행할 수 있습니다.

<script language="javascript" type="text/javascript">
    $(function () {
        $('div.imageHolder > a').each(function () {
            $(this).attr('href', $(this).attr('href') + '#tab-works');
        });
    });
</script>

조각 식별자는 MVC 5에서 지원됩니다.보다 ActionLink님의 과부하 상태 https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx 그리고 https://msdn.microsoft.com/en-us/library/dd492938(v=vs.118).aspx.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top