Există o modalitate de a include un identificator de fragmente atunci când utilizați Asp.Net MVC ActionLink, RedirectToAction, etc.?

Vreau ca unele linkuri să includă un identificator de fragmente. Ca și unele dintre adresele URL de pe acest site:

Debugging: IE6 + SSL + AJAX + post form = 404 error#5626

Există o modalitate de a face acest lucru cu oricare dintre metodele încorporate în MVC? Sau ar trebui să mă rostogolească propriile ajutoare HTML?

0
fr hi bn

7 răspunsuri

@Dominic,

Sunt aproape sigur că punerea pe traseu va cauza probleme de rutare.

@Ricky,

Până când MVC are sprijin pentru acest lucru, puteți deveni o școală mai veche despre modul în care faceți căile dvs. De exemplu, puteți converti:

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

în:

Home

Sau puteți să vă scrieți propriul ajutor care face în esență același lucru.

0
adăugat
Am încercat ținte în rute cu ASP.NET MVC Preview 3 și nu a existat nici o problemă cu rutarea. Prin urmare, deși sunteți "aproape pozitivi", ar fi util să vă elaborați problemele care vor apărea.
adăugat autor Dominic Cooney, sursa

După cum a scris Brad Wilson, puteți crea propriul dvs. link în vizualizările dvs. prin simpla concatenare a șirurilor de caractere. Dar pentru a adăuga un nume de fragment la o redirecționare generată prin RedirectToAction (sau similar), veți avea nevoie de ceva similar:

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

Și apoi, în controlorul dvs., ați sunat:

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

Aceasta ar trebui să genereze corect adresa URL.

0
adăugat
Asta e super. În MVC3 există o supraîncărcare pentru ActionLink care vă permite să faceți un fragment, dar nu RedirectToAction .
adăugat autor kamranicus, sursa
Sunteți, domnule, eroul meu. :)
adăugat autor Matt DiTrolio, sursa

Identificatoarele de fragmente sunt acceptate în MVC 5. Vedeți supraîncărcarea ActionLink la https://msdn.microsoft.com/en-us/library/dd460522 (v = vs.118) .aspx și https://msdn.microsoft.com/en-us/library/dd492938 (v = vs. 118) .aspx .

0
adăugat

Răspunsul scurt este: Nu. În ASP.NET MVC Preview 3 nu există nici o modalitate de primă clasă pentru includerea unei ancore într-o legătură de acțiune. Spre deosebire de url_for: anchor de la Rails, UrlHelper.GenerateUrl (și ActionLink, RedirectToAction și așa mai departe, care o folosesc) nu au un nume de proprietate magic care vă permite să codificați o ancora.

După cum subliniați, ați putea să vă răstoarnați. Aceasta este probabil cea mai curată soluție.

Hackily, ați putea să includeți o ancoră într-un traseu și să specificați valoarea în parametrii hash:

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

Aceasta va genera un URL ca / ​​Home / Index / # foo. Din păcate, acest lucru nu se joacă bine cu parametrii URL care apar la sfârșitul adresei URL. Deci, acest hack este funcțional numai în circumstanțe foarte simple în care toți parametrii dvs. apar ca componente ale căii URL.

0
adăugat
Nu funcționează. # Devine transformat în% 23.
adăugat autor jpbochi, sursa

Încercăm să includem sprijin pentru acest lucru în următoarea noastră versiune.

0
adăugat
aceasta va fi direcționată spre lansare în dev10?
adăugat autor ajma, sursa

Aceasta este o soluție de client, dar dacă aveți jQuery disponibile puteți face ceva de genul asta.

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

În MVC3 (și posibil mai devreme nu am verificat), puteți utiliza UrlHelper.GenerateUrl care trece în parametrul fragment. Iată o metodă de ajutor pe care o folosesc pentru a înfășura funcționalitateaL

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*/
    );
}
0
adăugat
Un pic ciudat, dar este cel mai bun răspuns de aici. Poate, ceilalți sunt doar datați.
adăugat autor jpbochi, sursa