Gibt es eine Möglichkeit, bei Verwendung von Asp.Net MVC ActionLink, RedirectToAction usw. eine Fragment-ID einzuschließen?

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

  •  08-06-2019
  •  | 
  •  

Frage

Ich möchte, dass einige Links eine Fragment-ID enthalten.Liken Sie einige der URLs auf dieser Website:

Debuggen:IE6 + SSL + AJAX + Post-Formular = 404-Fehler#5626

Gibt es eine Möglichkeit, dies mit einer der integrierten Methoden in MVC zu tun?Oder müsste ich meine eigenen HTML-Helfer rollen?

War es hilfreich?

Lösung

Wir überlegen, dies in unserer nächsten Version zu unterstützen.

Andere Tipps

Wie Brad Wilson schrieb, können Sie in Ihren Ansichten einen eigenen Link erstellen, indem Sie einfach Zeichenfolgen verketten.Um jedoch einen Fragmentnamen an eine über RedirectToAction (oder ähnliches) generierte Weiterleitung anzuhängen, benötigen Sie etwa Folgendes:

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

Und dann würden Sie in Ihrem Controller Folgendes aufrufen:

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

Dadurch sollte die URL korrekt generiert werden.

In MVC3 (und möglicherweise früher habe ich es nicht überprüft) können Sie UrlHelper.GenerateUrl verwenden und den Fragmentparameter übergeben.Hier ist eine Hilfsmethode, mit der ich die Funktionalität umschließe

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

@Dominic,

Ich bin mir fast sicher, dass es zu Routing-Problemen führen wird, wenn man das in die Route einfügt.

@Ricky,

Bis MVC dies unterstützt, können Sie bei der Erstellung Ihrer Routen etwas „old school“ vorgehen.Sie können beispielsweise Folgendes umwandeln:

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

hinein:

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

Oder Sie können Ihren eigenen Helfer schreiben, der im Wesentlichen dasselbe tut.

Die kurze Antwort lautet:NEIN.In ASP.NET MVC Preview 3 gibt es keine erstklassige Möglichkeit, einen Anker in einen Aktionslink einzubinden.Im Gegensatz zu Rails' url_for :anchor verfügen UrlHelper.GenerateUrl (und ActionLink, RedirectToAction usw., die es verwenden) nicht über einen magischen Eigenschaftsnamen, mit dem Sie einen Anker codieren können.

Wie Sie betonen, könnten Sie Ihr eigenes rollen, das funktioniert.Dies ist wahrscheinlich die sauberste Lösung.

Hackerhaft könnten Sie einfach einen Anker in eine Route einfügen und den Wert in Ihrem Parameter-Hash angeben:

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

Dadurch wird eine URL wie /Home/Index/#foo generiert.Leider funktioniert dies nicht gut mit URL-Parametern, die am Ende der URL erscheinen.Dieser Hack ist also nur unter wirklich einfachen Umständen praktikabel, wenn alle Ihre Parameter als URL-Pfadkomponenten erscheinen.

Dies ist eine clientseitige Lösung, aber wenn Sie JQuery zur Verfügung haben, können Sie so etwas tun.

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

Fragment-IDs werden in MVC 5 unterstützt.Sehen ActionLink's Überlastungen bei https://msdn.microsoft.com/en-us/library/dd460522(v=vs.118).aspx Und https://msdn.microsoft.com/en-us/library/dd492938(v=vs.118).aspx.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top