Principales respuestas
No puedo acceder a Login en sitio web MVC 5 multi idiomas con routing

Pregunta
-
Cuando hago clic en los enlaces para iniciar sesión y registrarse no sucede nada y la pagina correspondiente no aparece. Mi archivo RouteConfig.cs se muestra de la siguiente forma:
using System.Web.Mvc; using System.Web.Routing; namespace eoalak_mvc { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapLocalizeRoute("Default", url: "{culture}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" }); routes.MapRouteToLocalizeRedirect("RedirectToLocalize", url: "{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }); } } }
pero he notado que cuando lo modifico de la siguiente manera (añadiendo '{controller}') los enlaces de iniciar sesión y registrarse funcionan correctamente:
using System.Web.Mvc; using System.Web.Routing; namespace mysite_mvc { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapLocalizeRoute("Default", url: "{culture}/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" }); routes.MapRouteToLocalizeRedirect("RedirectToLocalize", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }); } } }
El problema es que no quiero que aparezca el controller en la URL (example.com/en/Account/Login) , lo que necesito es que se muestre de esta forma: example.com/en/Login (en todos los apartados de la web).
He leído en este foro: http://stackoverflow.com/questions/21168955/mvc-5-how-to-define-owin-loginpath-with-localized-routes que es necesario modificar el archivo Startup.Auth.cs , pero no se como hacerlo en el código que tengo:
using System; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Microsoft.Owin.Security.Google; using Owin; using mysite_mvc.Models; namespace mysite_mvc { public partial class Startup { // Para obtener más información para configurar la autenticación, visite http://go.microsoft.com/fwlink/?LinkId=301864 public void ConfigureAuth(IAppBuilder app) { // Configure el contexto de base de datos, el administrador de usuarios y el administrador de inicios de sesión para usar una única instancia por solicitud app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); // Permitir que la aplicación use una cookie para almacenar información para el usuario que inicia sesión // y una cookie para almacenar temporalmente información sobre un usuario que inicia sesión con un proveedor de inicio de sesión de terceros // Configurar cookie de inicio de sesión app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { // Permite a la aplicación validar la marca de seguridad cuando el usuario inicia sesión. // Es una característica de seguridad que se usa cuando se cambia una contraseña o se agrega un inicio de sesión externo a la cuenta. OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // Permite que la aplicación almacene temporalmente la información del usuario cuando se verifica el segundo factor en el proceso de autenticación de dos factores. app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); // Permite que la aplicación recuerde el segundo factor de verificación de inicio de sesión, como el teléfono o correo electrónico. // Cuando selecciona esta opción, el segundo paso de la verificación del proceso de inicio de sesión se recordará en el dispositivo desde el que ha iniciado sesión. // Es similar a la opción Recordarme al iniciar sesión. app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); // Quitar los comentarios de las siguientes líneas para habilitar el inicio de sesión con proveedores de inicio de sesión de terceros //app.UseMicrosoftAccountAuthentication( // clientId: "", // clientSecret: ""); //app.UseTwitterAuthentication( // consumerKey: "", // consumerSecret: ""); //app.UseFacebookAuthentication( // appId: "", // appSecret: ""); //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() //{ // ClientId = "", // ClientSecret = "" //}); } } }
¿Cómo podría modificar ese código? o ¿qué debo hacer para que no aparezca el controller en la URL sin afectar el funcionamiento del Login?
Respuestas
-
Puedes añadir la ruta del Login en el RouteConfig:
routes.MapLocalizeRoute("Login", url: "{culture}/Login/{id}", defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }, constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" }); routes.MapLocalizeRoute("Default", url: "{culture}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });
Píldoras .NET
Artículos, tutoriales y ejemplos de código .NETPíldoras JS
Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...- Marcado como respuesta jose-vasquez-peru martes, 4 de agosto de 2015 23:22
Todas las respuestas
-
Puedes añadir la ruta del Login en el RouteConfig:
routes.MapLocalizeRoute("Login", url: "{culture}/Login/{id}", defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }, constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" }); routes.MapLocalizeRoute("Default", url: "{culture}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });
Píldoras .NET
Artículos, tutoriales y ejemplos de código .NETPíldoras JS
Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...- Marcado como respuesta jose-vasquez-peru martes, 4 de agosto de 2015 23:22
-
Hola
Asier, gracias por tu respuesta, pero ahora se presenta otro problema, en RouteConfig he añadido este otro código para que funcione el link de registrarse:
routes.MapLocalizeRoute("Register", url: "{culture}/Register/{id}", defaults: new { controller = "Account", action = "Register", id = UrlParameter.Optional }, constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });
Me he registrado con un correo y una contraseña y ahora en la parte superior de la web aparece: Hola (mi e-mail) y el link para cerrar sesión pero cuando le hago clic no sucede nada, no puedo cerrar sesión. ¿a qué se debe ese inconveniente?
- Editado jose-vasquez-peru martes, 4 de agosto de 2015 23:04
-
¿A qué acción llama el botón cerrar sesión?
Píldoras .NET
Artículos, tutoriales y ejemplos de código .NETPíldoras JS
Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ... -
He logrado que funcione el link 'cerrar sesión' añadiendo este código:
routes.MapLocalizeRoute("LogOff", url: "{culture}/LogOff/{id}", defaults: new { controller = "Account", action = "LogOff", id = UrlParameter.Optional }, constraints: new { culture = "[a-zA-Z]{1}[a-zA-Z]{1}" });
Supongo que esa era la acción:LogOff