2008-11-08 13 views
142

En ASP.NET MVC, intento crear un enlace que incluya una etiqueta de anclaje (es decir, dirigir al usuario a una página y una sección específica de la página).Incluyendo una etiqueta de anclaje en ASP.NET MVC Html.ActionLink

La URL que estoy tratando de crear debe ser similar al siguiente:

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

Mi enrutamiento está configurado con la norma:

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

La sintaxis de enlace de acción que estoy usando es:

<%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> 
<%} %> 

Mi método controlador es el siguiente:

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

    return View(itemList); 
} 

El anterior devuelve correctamente una dirección URL de la siguiente manera:

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

no puedo encontrar la manera de añadir los # SECCIÓN 12 parte. La palabra "sección" es solo la convención que estoy usando para dividir las secciones de la página, y la 12 es la ID de la subcategoría, es decir, child.ID.

¿Cómo puedo hacer esto?

Respuesta

92

que probablemente construir el enlace de forma manual, como esto:

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

realmente debe utilizar las sobrecargas de ActionLink como se describe por @Brad Wilson. – mattruma

+18

@mattruma lo siento, no estoy de acuerdo. BESO. ¿Por qué tener un miembro lleno de parámetros, algunos de los cuales se dejan como nulos, cuando puede simplemente indicarlo explícitamente? Cualquiera puede ver lo que significa lo anterior por lo que la respuesta de Brad es intrincada y requiere que entres en intellisense. Demasiados parámetros es un patrón anti reconocido. Http://c2.com/cgi/wiki? TooManyParameters –

+2

Estoy de acuerdo. Ambos métodos funcionan, pero dado que la forma en que se especifican los fragmentos en las URL no va a cambiar en el futuro cercano, creo que de esta manera es más legible y claro en su intento. Si es necesario, puede extender el objeto 'Url' o' Html' con un método personalizado que incluya una forma simple de agregar una cadena de fragmento. – LorenzCK

261

Hay sobrecargas de ActionLink que tienen un parámetro fragmento. Pasar "section12" como fragmento te dará el comportamiento que buscas.

Por ejemplo, llamar LinkExtensions.ActionLink Method (HtmlHelper, String, String, String, String, String, String, Object, Object):

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

¿Estas sobrecargas son parte de una biblioteca de extensiones? Parece que no los tengo. – grenade

+0

Hay dos: cadena pública pública ActionLink (este HtmlHelper htmlHelper, cadena linkText, string actionName, string controllerName, string protocol, string hostName, string fragmento, object routeValues, object htmlAttributes); public static string ActionLink (esto HtmlHelper HtmlHelper, linkText cadena, actionName cadena, controllerName cadena, protocolo de cadena, nombre de host cadena, fragmento de cadena, routeValues ​​RouteValueDictionary, IDictionary htmlAttributes); –

+11

+1 Esta es definitivamente la mejor manera. – mattruma

0

Mi solución funcionará si se aplica el ActionFilter al método de acción Subcategoría, siempre que uno siempre quiere redirigir al usuario a la misma marcador:

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

Modifica el búfer HTML y genera una pequeña porción de javascript para indicar al navegador que agregue el marcador.

Puede modificar el javascript para desplazarse manualmente, ¡en lugar de utilizar un marcador en la URL, por supuesto!

espero que ayude :)

13

no recuerdo en qué versión de ASP.NET MVC (ASP.NET MVC 3+ creo)/Razor el parameterlabeldeclaration o como se llame (parámetro: x) función fue presentado, pero para mí esta es definitivamente la forma correcta de construir un enlace con un ancla en ASP.NET MVC.

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

Ni siquiera Ed Blackburns argumento anti patrón de this answer puede competir con eso.

+1

Literalmente me salvó la vida. Atribuir su publicación como mi solución aquí http://stackoverflow.com/questions/32420028/how-to-create-dropdown-navbar-menu-item-in-layout-cshtml-in-asp-net. – Matthew

+0

¡No puedo decir lo suficiente gracias por esto! – john

+0

@john, de nada! – PussInBoots

1

Aquí está el ejemplo de la vida real

@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") 

Y la página de destino tiene 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

lo hice y funciona para redirigir a otra vista Creo que si se agrega el #sectionLink después de que se trabajará

<a class="btn yellow" href="https://stackoverflow.com/users/Create/@Model.Id" target="_blank"> 
             Add As User 
            </a> 
5

sólo lo hice así:

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