GetVirtualPath metode i MVC

stemmer
0

Kan noen forklare hvordan den virtuelle banen blir beregning? Ifølge RouteData.Values ​​eller i henhold til url mønster?

Jeg prøver å fjerne noen routedata verdier, men likevel den virtuelle banen ikke endringer. Jeg har et problem som den virtuelle banen retur med redundant skråstrek på begynnelsen av nettadressen som: / han / controller / action skråstreken før kulturen er overflødig ...

Jeg bruker egendefinerte ruter som følgende

    routes.Add(Default,
             new CustomRoute({culture}/{controller}/{action}/{id},
                 new
                 {
                     controller = Desktop,
                     action = Index,
                     culture = he-IL,
                     guid = ,
                     id = UrlParameter.Optional
                 }));
  routes.Add(Wizard_ + wizard,
                        new CustomRoute({guid}/{culture}/ + wizardName + /{action}/{id},
                        new
                        {
                            controller = wizard,
                            action = Index,
                            culture = he-IL,
                            guid = ,
                            id = UrlParameter.Optional
                        }));

er problemet ved bruk av Url.Action (handling, controller) -metoden og handlingen er i veiviseren kontrolleren, slik at nettadressen for den handling er veiviseren format som guid {} / {kultur} / + veiviseren + / {handling} / {id} bu guid verdi er tom, og den returnerte adressen er // han-il / styreenhet / handling i stedet for / han-il / styreenhet / action

Den CustomRoute klasse:

public class CustomRoute : Route
{
    private List<string> _wizards;

    public CustomRoute(string uri, object defaults)
        : base(uri, new RouteValueDictionary(defaults), new MvcRouteHandler())
    {
        _wizards = new List<string>();
        FillWizards(ref _wizards);
        DataTokens = new RouteValueDictionary();
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        bool hasGuid = httpContext.Request.RequestContext.RouteData != null 
            && httpContext.Request.RequestContext.RouteData.Values != null 
            && httpContext.Request.RequestContext.RouteData.Values.ContainsKey(guid) 
            && !httpContext.Request.RequestContext.RouteData.Values[guid].ToString().Equals(Guid.Empty);

        var routeData = base.GetRouteData(httpContext);
        if (routeData == null)
            return null;

        bool isWizard = _wizards.Contains(routeData.Values[controller].ToString());
        Debug.WriteLine(Controller:  + routeData.Values[controller] +  action:  + routeData.Values[action] +  Is wizard:  + isWizard +  has guid:  + hasGuid);
        if (isWizard && !hasGuid)
        {
            if (string.IsNullOrEmpty(routeData.Values[guid].ToString()))
            {
                routeData.Values[guid] = Guid.NewGuid().ToString(N);
            }
        }

        return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        VirtualPathData path;
        path = base.GetVirtualPath(requestContext, values);

        return path;
    }

    private void FillWizards(ref List<string> items)
    {
        var _configuration = ObjectFactory.GetInstance<IConfiguration>();
        List<string> wizards = _configuration.GetParamValue<string>(SessionUniqueWizards, ).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();

        items = wizards;
    }
}
Publisert på 29/03/2016 klokken 13:04
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Grunnen til at din guidmangler parameter er fordi

  1. Det er ingen guidparameter i kallet til Url.Action(action, controller).
  2. Det er (tilsynelatende) ingen guidparameter i gjeldende forespørsel. Det vil si at den aktuelle ruten som blir rammet har ingen guidrute verdi.
  3. Du har angitt standardverdien for guid( guid = ""). Siden tom streng er hva du har angitt som standard, er tom streng hva du får som standard.

For nettadressen til å bygge riktig, guidmå komme fra et sted. MVC går alltid matche ruteverdier fra gjeldende forespørsel når du bygger utgående URLer, men siden ikke alle nettadresser har guiddu trenger å spesifisere det for sidene der det ikke eksisterer i den sammenheng:

Url.Action("Index", "Search", new { guid = "a565f84f9152495792d433f5bd26000f")

Dette er den vanlige måten å gjøre det. Vanligvis hvis du bygger på linken for en CRUD operasjon du gjør det innen en liste over enheter.

For eksempel, for en Productenhet, du ville normalt ha koblinger til Edit Productog Delete Productfor hvert Producti en liste som vil se omtrent slik ut:

<tr>
    <td>model.ProductName</td>
    <td>@Html.ActionLink("Product", "Edit", new { guid = model.ProductId })</td>
    <td>@Html.ActionLink("Product", "Delete", new { guid = model.ProductId })</td>
</tr>

Det vil også vanligvis være en lenke for å legge en ny enhet som ikke har noen identifikator.

@Html.ActionLink("Product", "Add")

Men det er uklart fra ditt eksempel hvordan en "wizard" ville bli opprettet. Opprette en ny identifikator skal normalt være en funksjon av Addmetoden, ikke som en rute.

Men det synes å være et problem der du er tilfeldig generere en GUID i din rute, så det er uklart hvordan du forventer denne verdien skal opprettholdes fra en forespørsel til den neste.

Svarte 30/03/2016 kl. 16:04
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more