Pergunta

Eu tenho o seguinte ActionLink no meu ponto de vista

<%= Html.ActionLink("LinkText", "Action", "Controller"); %>

e cria o seguinte URL http://mywebsite.com/Controller/Action

Say I adicionar um ID no final assim: http://mywebsite.com/Controller/Action / 53 e navegue até a página. Nesta página Tenho a marcação I especificado acima. Agora, quando eu olhar para a URL que ele cria é parecido com este:

http://mywebsite.com/Controller/Action/53 (notar a adição de o ID)

Mas eu quero-o para remover o ID e olhar como ele fez originalmente, assim http://mywebsite.com / controller / action (aviso nº ID aqui)

Alguma idéia de como posso resolver isso? Eu não quero usar URLs codificados desde a minha controller / ações podem mudar.

Foi útil?

Solução

A solução é especificar os meus próprios valores de rota (o terceiro parâmetro abaixo)

<%= Html.ActionLink("LinkText", "Action", "Controller", 
    new { id=string.Empty }, null) %>

Outras dicas

Parece que você precisa registrar uma segunda "Ação Only" rota e usar Html.RouteLink (). Primeiro, registre uma rota como esta em sua aplicação iniciar-se:

routes.MapRoute("ActionOnly", "{controller}/{action}", 
   new { controller = "Home", action = "Index" } );

Então, em vez de ActionLink para criar esses links usar:

Html.RouteLink("About","ActionOnly")

O problema é o construído em métodos de tirar a entrada do URL você está no momento, bem como o que você fornecer. Você poderia tentar o seguinte:

<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %>

Isso deve limpar manualmente o parâmetro id.

Não sei porque, mas não funcionou para mim (talvez por causa da MVC2 RC). Criado UrlHelper method =>

 public static string
            WithoutRouteValues(this UrlHelper helper, ActionResult action,params string[] routeValues)
        {
            var rv = helper.RequestContext.RouteData.Values;
            var ignoredValues = rv.Where(x=>routeValues.Any(z => z == x.Key)).ToList();
            foreach (var ignoredValue in ignoredValues)
                rv.Remove(ignoredValue.Key);
            var res = helper.Action(action);
            foreach (var ignoredValue in ignoredValues)
                rv.Add(ignoredValue.Key, ignoredValue.Value);
            return res;
        }

Se você não quer saber o que os valores precisam ser explicitamente substituído ou você só quer evitar a lista extra de parâmetros que você pode usar um método de extensão como o abaixo.

<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a>

Os detalhes de implementação são neste post

Eu definir explicitamente o nome da ação como "ação /". Parece um pouco como um hack, mas é uma solução rápida.

@Html.ActionLink("Link Name", "Action/", "Controller")

Outra maneira é usar ActionLink (HtmlHelper, String, String, RouteValueDictionary) sobrecarga, então não há necessidade de colocar nulo no último parâmetro

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>

As sobrecargas de Html.ActionLink são alteradas nas versões posteriores do MVC. Em MVC 5 e acima. Isto é como fazer isso:

@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null)

Nota passei "" para o parâmetro id e nulo para htmlAttributes.

Eu precisava de meus links do menu para ser dinâmico. Em vez de implementar um monte de código extra e encaminhamento para cada simples página I dispensada com o HTML helper.

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top