Is daar 'n manier om 'n fragment identifiseerder sluit by die gebruik van Asp.Net MVC ActionLink, RedirectToAction, ens?

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

  •  08-06-2019
  •  | 
  •  

Ander wenke

As Brad Wilson geskryf, jy kan jou eie skakel in jou mening te bou deur eenvoudig concatenating snare. Maar om 'n fragment naam voeg tot 'n aanstuur gegenereer via RedirectToAction (of soortgelyke) jy iets soos hierdie moet:

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

En dan, in jou kontroleerder, jy noem:

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

Dit moet die URL korrek op te wek.

In MVC3 (en moontlik vroeër het ek nie nagegaan), kan jy gebruik UrlHelper.GenerateUrl verby in die parameter fragment. Hier is 'n helper metode wat ek gebruik om die functionalityL draai

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,

Ek is amper oortuig dat om dit in die roete sal veroorsaak dat routing kwessies.

@Ricky,

Tot MVC het ondersteuning vir hierdie, jy kan 'n bietjie meer "ou skool" oor hoe jy jou roetes te maak. Byvoorbeeld, kan jy sit:

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

in:

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

Of jy kan jou eie helper wat in wese nie skryf dieselfde ding.

Die kort antwoord is: Nee, want ten ASP.NET MVC Voorskou 3 daar is geen eerste-klas manier vir die insluiting van 'n anker in 'n aksie skakel. In teenstelling met Rails 'url_for:. Anker, UrlHelper.GenerateUrl (en ActionLink, RedirectToAction en so aan wat dit gebruik) het nie 'n magic eiendom naam waarmee jy 'n anker enkodeer

As jy wys is, kan jy rol jou eie wat doen. Dit is waarskynlik die skoonste oplossing.

Hackily, kan jy net sluit 'n anker in 'n roete en spesifiseer die waarde in jou parameters hash:

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

Dit sal 'n URL soos / Home / Indeks / # cat genereer. Ongelukkig is dit nie goed speel met URL parameters, wat aan die einde van die URL verskyn. So hierdie hack is slegs werkbare in baie eenvoudige omstandighede waar al jou parameters verskyn as komponente URL pad.

Dit is 'n kliënt kant oplossing, maar as jy 'jQuery beskikbaar wat jy kan iets soos dit te doen.

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