asp.net mvc Html.ActionLink () valor de manutenção de rota Eu não quero
-
13-09-2019 - |
Pergunta
Eu tenho o seguinte ActionLink no meu ponto de vista ??p>
<%= 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.
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>