Domanda

ho aggiornato il mio progetto per ASP.NET 4 RTM con ASP.NET MVC 2.0 RTM oggi.

Sono stato in precedenza usando ASP.NET 3.5 con ASP.NET MVC 2.0 RTM.

Alcuni dei miei percorsi non funzionano improvvisamente e io non so perché. Non sono sicuro se qualcosa è cambiato tra 3,5 e 4,0 - o se questo era un problema di tipo regressione nella RTM 4.0. (Non ho mai precedentemente provato il mio app con 4.0).

mi piace uso Url.RouteUrl("route-name", routeParams) per evitare ambiguità nella generazione URL. Ecco la mia definizione della rotta per una pagina della galleria. Voglio imageID sia facoltativa (si ottiene una pagina di anteprima, se non si specifica di esso).

// gallery id
routes.MapRoute(
    "gallery-route",
    "gallery/{galleryID}/{imageID}/{title}",
    new { controller = "Gallery", action = "Index", 
          galleryID = (string) null, 
          imageID = (string) null, 
          title = (string) null}
);

In .NET 3.5 / ASP.NET 2.0 RTM / IIS7

Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> /gallery/cats

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")             
=>  /gallery/cats/4

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")  
=>  /gallery/cats/4/tiddles

In .NET 4.0 RTM / ASP.NET 2.0 RTM / IIS7

Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> null

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")             
=>  /gallery/cats/4

Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")  
=>  /gallery/cats/4/tiddles

In precedenza ho potuto fornire solo il galleryID e tutto il resto sarebbe ignorato nella URL generato. Ma ora che sta cercando come ho bisogno di specificare tutti i parametri fino title -. O rinuncia nel determinare l'URL

URL in entrata lavoro bene per /gallery/cats e mappata correttamente attraverso questa regola con imageID e title essendo entrambi null assegnato nel mio controller.

Ho anche testato i percorsi in entrata con http: // haacked .com / archive / 2008/03/13 / url-routing debugger.aspx e tutti funzionano bene.

È stato utile?

Soluzione

Il modo corretto di specificare parametri opzionali in ASP.NET MVC 2.0 utilizza il UrlParameter.Optional campo:

routes.MapRoute(
    "gallery-route",
    "gallery/{galleryID}/{imageID}/{title}",
    new
    {
        controller = "Gallery",
        action = "Index",
        galleryID = UrlParameter.Optional,
        imageID = UrlParameter.Optional,
        title = UrlParameter.Optional
    }
);

Supponendo che il controllore e l'azione seguente:

public class GalleryController : Controller
{
    public ActionResult Index(string galleryID, string imageID, string title)
    {
        return View();
    }
}

Tutti questi lavori volontà come previsto:

<%= Url.RouteUrl("gallery-route", new { galleryID = "cats" }) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4"}) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles" })%>

Render come:

/gallery/cats
/gallery/cats/4
/gallery/cats/4/tiddles

Nota:. Testato su Windows 7 x64, Visual Studio 2010 RTM, progetto ASP.NET MVC 2.0

Altri suggerimenti

So che la domanda è per MVC2 ma nel MVC3, la risposta data da Darin Dimitrov fallirà.

Phil Haack ha spiegato il problema e ha dato l'attorno al lavoro nel suo blog: http: // haacked .com / archive / 2011/02/20 / instradamento regressione-con-due-consecutivi-optional-url-parameters.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top