Esiste un modo per includere un identificatore di frammento quando si utilizza Asp.Net MVC ActionLink, RedirectToAction, ecc.?

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

  •  08-06-2019
  •  | 
  •  

Domanda

Voglio che alcuni collegamenti includano un identificatore di frammento.Come alcuni degli URL su questo sito:

Debug:IE6 + SSL + AJAX + modulo postale = errore 404#5626

C'è un modo per farlo con uno qualsiasi dei metodi integrati in MVC?Oppure dovrei creare i miei helper HTML?

È stato utile?

Soluzione

Stiamo cercando di includere il supporto per questo nella nostra prossima versione.

Altri suggerimenti

Come ha scritto Brad Wilson, puoi creare il tuo collegamento nelle tue visualizzazioni semplicemente concatenando le stringhe.Ma per aggiungere un nome di frammento a un reindirizzamento generato tramite RedirectToAction (o simile) avrai bisogno di qualcosa del genere:

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

E poi, nel tuo controller, chiameresti:

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

Questo dovrebbe generare l'URL correttamente.

In MVC3 (e forse prima non ho controllato), puoi utilizzare UrlHelper.GenerateUrl passando il parametro Fragment.Ecco un metodo di supporto che utilizzo per racchiudere la funzionalitàL

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*/
    );
}

@Domenico,

Sono quasi sicuro che inserirlo nel percorso causerà problemi di routing.

@Ricky,

Fino a quando MVC non avrà il supporto per questo, puoi essere un po' più "vecchia scuola" su come realizzare i tuoi percorsi.Ad esempio, puoi convertire:

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

in:

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

Oppure puoi scrivere il tuo aiutante che fa essenzialmente la stessa cosa.

La risposta breve è:NO.In ASP.NET MVC Preview 3 non esiste un modo efficace per includere un ancoraggio in un collegamento di azione.A differenza di url_for :anchor di Rails, UrlHelper.GenerateUrl (e ActionLink, RedirectToAction e così via che lo usano) non hanno un nome di proprietà magica che ti permetta di codificare un'ancora.

Come hai sottolineato, potresti lanciarne uno tuo.Questa è probabilmente la soluzione più pulita.

Hackily, potresti semplicemente includere un'ancora in un percorso e specificare il valore nell'hash dei parametri:

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

Questo genererà un URL come /Home/Index/#foo.Sfortunatamente questo non funziona bene con i parametri URL, che appaiono alla fine dell'URL.Quindi questo hack è realizzabile solo in circostanze davvero semplici in cui tutti i parametri appaiono come componenti del percorso URL.

Questa è una soluzione lato client ma se hai jquery disponibile puoi fare qualcosa del genere.

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

Gli identificatori di frammento sono supportati in MVC 5.Vedere ActionLinkè sovraccarico a https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx E https://msdn.microsoft.com/en-us/library/dd492938(v=vs.118).aspx.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top