ASP.NET MVC Html.ActionLink에 앵커 태그 포함


151

ASP.NET MVC에서 앵커 태그 (즉, 사용자를 페이지 및 페이지의 특정 섹션으로 연결)를 포함하는 링크를 만들려고합니다.

만들려고하는 URL은 다음과 같아야합니다.

<a href="/category/subcategory/1#section12">Title for a section on the page</a>

내 라우팅이 표준으로 설정되었습니다.

routes.MapRoute("Default", "{controller}/{action}/{categoryid}"); 

사용중인 액션 링크 구문은 다음과 같습니다.

<%foreach (Category parent in ViewData.Model) { %>
<h3><%=parent.Name %></h3>
<ul>
<%foreach (Category child in parent.SubCategories) { %>
    <li><%=Html.ActionLink<CategoryController>(x => x.Subcategory(parent.ID), child.Name) %></li>
<%} %>
</ul>
<%} %>

내 컨트롤러 방법은 다음과 같습니다.

public ActionResult Subcategory(int categoryID)
{
   //return itemList

   return View(itemList);
}

위의 URL은 다음과 같이 올바르게 반환됩니다.

<a href="/category/subcategory/1">Title for a section on the page</a>

# section12 부분 을 추가하는 방법을 알 수 없습니다 . "섹션"단어는 페이지 섹션을 나누기 위해 사용하는 규칙 일 뿐이며, 12는 하위 범주의 ID (예 : child.ID)입니다.

어떻게해야합니까?

답변:


97

아마 다음과 같이 링크를 수동으로 만들 것입니다.

<a href="<%=Url.Action("Subcategory", "Category", new { categoryID = parent.ID }) %>#section12">link text</a>

20
@Brad Wilson의 설명에 따라 ActionLink의 과부하를 사용해야합니다.
mattruma

18
@mattruma 동의하지 않아 죄송합니다. 키스. 왜 명시 적으로 명시 할 수있을 때 멤버로 매개 변수가 가득 찬 이유는 무엇입니까? 누구나 브래드의 반응이 뒤 얽히고 지능을 파헤쳐 야한다는 위의 의미를 알 수 있습니다. 너무 많은 매개 변수가 .. 인정 안티 패턴 c2.com/cgi/wiki?TooManyParameters
에드 블랙번

2
나는 동의한다. 두 방법 모두 작동하지만 URL에 조각이 지정되는 방식은 가까운 미래에 변경되지 않으므로이 방법은 실제로 더 읽기 쉽고 명확하다고 생각합니다. 필요한 경우 조각 문자열을 추가하는 간단한 방법이 포함 된 사용자 지정 방법으로 객체 Url또는 Html객체를 계속 확장 할 수 있습니다 .
LorenzCK

282

단편 매개 변수 를 취하는 ActionLink의 과부하가 있습니다 . 조각으로 "section12"를 전달하면 당신이 겪고있는 행동을 얻게됩니다.

예를 들어, LinkExtensions.ActionLink 메서드 호출 (HtmlHelper, String, String, String, String, String, String, Object, Object) :

<%= Html.ActionLink("Link Text", "Action", "Controller", null, null, "section12-the-anchor", new { categoryid = "blah"}, null) %>

1
이러한 과부하는 확장 라이브러리의 일부입니까? 나는 그들을 얻지 못하는 것 같습니다.
수류탄

public static string ActionLink (이 HtmlHelper htmlHelper, 문자열 linkText, 문자열 actionName, 문자열 controllerName, 문자열 프로토콜, 문자열 hostName, 문자열 조각, 객체 routeValues, 객체 htmlAttributes); 공개 정적 문자열 ActionLink (이 HtmlHelper htmlHelper, 문자열 linkText, 문자열 actionName, 문자열 controllerName, 문자열 프로토콜, 문자열 hostName, 문자열 조각, RouteValueDictionary routeValues, IDictionary <string, object> htmlAttributes);
Brad Wilson

11
이것이 답이되어야합니다.
Rubens Mariuzzo

1
조각을 전달하여 앵커를 지정할 수있는 Html.ActionLink의 오버로드는 컨트롤러를 이름으로 전달하도록합니다. 나는 그것을 좋아하지 않는다. 컨트롤러 이름이 올바르지 않으면 컴파일 오류가 아닌 런타임 예외가 발생합니다.
R. Schreurs

1
링크 텍스트가 단순한 텍스트 이상인 경우 @RobertMcKee Html.ActionLink()어떤 시나리오에서도 작동하지 않습니다 href=@Url.Action(). 스타일 구문 을 사용해야 합니다.
Katstevens

15

나는 어떤 버전의 ASP.NET MVC (ASP.NET MVC 3+라고 생각하는지) / Razor 매개 변수 레이블 선언 또는 그것이 무엇이든 (매개 변수 : x) 기능이 도입 된 것을 기억하지 못하지만 이것은 나에게 이것이 올바른 방법입니다. ASP.NET MVC에서 앵커로 링크를 빌드하십시오.

@Html.ActionLink("Some link text", "MyAction", "MyController", protocol: null, hostName: null, fragment: "MyAnchor", routeValues: null, htmlAttributes: null)

이 답변의 Ed Blackburns 반 패턴 주장조차도 그와 경쟁 할 수는 없습니다.


1
말 그대로 이것은 내 생명을 구했습니다. 귀하의 게시물을 내 솔루션으로 여기에 올리십시오 . stackoverflow.com/questions/32420028/…
Matthew

11

방금 다음과 같이했습니다.

<a href="@Url.Action("Index","Home")#features">Features</a>

1

실제 사례는 다음과 같습니다.

@Html.Grid(Model).Columns(columns =>
    {
           columns.Add()
                   .Encoded(false)
                   .Sanitized(false)
                   .SetWidth(10)
                   .Titled(string.Empty)
                   .RenderValueAs(x => @Html.ActionLink("Edit", "UserDetails", "Membership", null, null, "discount", new { @id = @x.Id }, new { @target = "_blank" }));

  }).WithPaging(200).EmptyText("There Are No Items To Display")

대상 페이지에는 TABS가 있습니다.

<ul id="myTab" class="nav nav-tabs" role="tablist">

        <li class="active"><a href="#discount" role="tab" data-toggle="tab">Discount</a></li>
    </ul>

0

항상 동일한 책갈피로 사용자를 리디렉션하려는 경우 ActionFilter를 Subcategory 작업 메서드에 적용하면 내 솔루션이 작동합니다.

http://spikehd.blogspot.com/2012/01/mvc3-redirect-action-to-html-bookmark.html

HTML 버퍼를 수정하고 브라우저에 책갈피를 추가하도록 지시하는 작은 자바 스크립트를 출력합니다.

URL에서 북마크를 사용하는 대신 자바 스크립트를 수동으로 스크롤하도록 수정할 수 있습니다.

그것이 도움이되기를 바랍니다 :)


0

나는 그것을하고 다른보기로 리디렉션하는 데 효과가 있다고 생각합니다. #sectionLink를 추가 한 후에 작동한다면

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.