26 messaggi dal 23 luglio 2013
Un saluto a tutti,
ho una web application in web forms e ho deciso di aggiungere un area al progetto per acquisire maggiore confidenza con il pattern MVC e portare in seguito qualche miglioria. Il progetto web forms funziona correttamente anche nella sua parte dove implementa le web api ed il routing è così definito:
public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(
        new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
}
con relativa chiamata: WebApiConfig.Register(GlobalConfiguration.Configuration); in Global.asax.cs

Ho aggiunto un area "Guide", ho definito un controller "Welcome" ed in guideAreaRegistration.cs ho definito:
public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "guide_default",
        "Guide/{controller}/{action}/{id}",
            new { controller = "Welcome", action = "Index", id = UrlParameter.Optional }
    );
}
anche questa con relativa chiamata in testa ad Application_Start in Global.asax.cs: AreaRegistration.RegisterAllAreas();

Ora, le mie perplessità sono queste:
1) è normale che http://localhost:64661/Guide/Welcome/ non chiami di default la action Index?
2) è normale che http://localhost:64661/Guide/Welcome/Index/ debba avere slash finale per invocare la action altrimenti è errorre 404?
3) perchè http://localhost:64661/Guide/Welcome/Details/77 invoca la action Details con id sempre a null nonostante 77?
4) perchè return RedirectToAction("Index/"); necessita del carattere slash per funzionare?

Di seguito il codice in questione:
public class WelcomeController : Controller
{
    // GET: Guide/Welcome
    public ActionResult Index()
    {
        return View();
    }

    // GET: guide/Welcome/Details/5
    public ActionResult Details(int? id)
    {
       if (id == null)
           return RedirectToAction("Index/");
       return View();
    }
}
427 messaggi dal 13 novembre 2009
Scusa magari mi sfugge al volo qualcosa e potrei aver risposto di fretta, ma tu scrivi
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

di default mi pare che questa sia sintassi per sgetire chiamate su controller Api (webapi) e non MVC. Peraltro cmq non corretto. Direi

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Cosi se Chiami /Guide per default punta a Index e renderizza la view con stesso nome...Forse è per quello che Id è sempre null perché il costrutto controller/action/parameter non è rispettato.

F.
Modificato da flaviovb il 10 settembre 2018 13.58 -
Modificato da flaviovb il 10 settembre 2018 13.59 -
Modificato da flaviovb il 10 settembre 2018 13.59 -
26 messaggi dal 23 luglio 2013
Ciao!
MapHttpRoute delle WebApi2 sembra accetti solo RouteParameter.Optional definito in System.Web.Http mentre UrlParameter.Optional sembra sia prerogativa solo di System.Web.Mvc come se fossero due framework diversi. Per fortuna la parte delle api mi funziona correttamente.... la parte MVC (Guide) ha invece secondo me qualcosa che non va perchè da ciò che leggo dovrebbe comportarsi diversamente. Una cosa che mi è venuta in mente è che la creazione dell'area mi ha generato anche il file App_Start/RouteConfig.cs (in aggiunta ai 2 routing precedentemente esposti) contenente:
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }
e che ho richiamato all fine di Application_Start in in Global.asax.cs con RouteConfig.RegisterRoutes(RouteTable.Routes); (come da istruzioni in readme)
427 messaggi dal 13 novembre 2009
Beh le aree prevedono hai definizione specifica dei parametri di reouting per default perché naturalmente antepongono un prefix per l'area. Non ho una visione di insieme della struttura del progetto ai livello di dichiarazione delle configurazioni relative a routing webforms, routing api, routing area mvc. Quindi vado a memoria...alla fine quindi hai qualche problema solo per la gestione delle aree?
26 messaggi dal 23 luglio 2013
Si alla fine è solo l'area mvc che ha problemi, solo che non sono proprio da a poco. Che Guide/Welcome/Details/77 sollevi la action Details con id a null per me è inspiegabile! Boh... continuo a googlare :\ Ad ogni modo grazie per tempo
26 messaggi dal 23 luglio 2013
Ho scoperto cos'era! In Web.config avevo implementato un modulo rewite url, o meglio: https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/creating-outbound-rules-for-url-rewrite-module; aggiungendo la regola di esclusione verso l'area "Guide" (sotto riportata) a conditions
<add input="{REQUEST_URI}" pattern="Guide/" ignoreCase="true" negate="true" />

tutto è tornato a funzionare correttamente.
427 messaggi dal 13 novembre 2009
a ecco! mancava qualcosa...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.