Is daar 'n manier om 'n fragment identifiseerder sluit by die gebruik van Asp.Net MVC ActionLink, RedirectToAction, ens?
-
08-06-2019 - |
Vra
Ek wil 'n paar skakels na 'n fragment identifiseerder sluit. Soos sommige van die URLs op hierdie site:
Ontfouting: IE6 + SSL + AJAX + post vorm = 404-fout 'n> # 5626
Is daar 'n manier om dit te doen met enige van die ingeboude in metodes in MVC? Of sal ek moet my eie HTML helpers rol?
Oplossing
Ons is op soek na, insluitende ondersteuning vir hierdie in ons volgende uitgawe.
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>
Fragment identifiseerders word ondersteun in MVC 5. Sien ActionLink
se oorlaai op https://msdn.microsoft.com/en-us/library/dd460522 (v = vs.118) Aspx en https://msdn.microsoft.com/en-us/library/dd492938 (v = vs.118) Aspx 'n>.