tag renderbody página para net método mvc llamado diseño busqueda asp asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing url-routing attributerouting

asp.net mvc - renderbody - Cambiar la ruta al nombre de usuario después del registro



search asp net core (0)

He seguido la respuesta correcta marcada para este hilo ¿Cómo cambiar la ruta al nombre de usuario después de iniciar sesión? y mi requisito es exactamente lo que dice la pregunta. Sin embargo, cuando registro un nuevo usuario (estoy usando un nombre de usuario en lugar de un correo electrónico), la redirección no sigue mi ruta personalizada.

Por ejemplo, cuando me registro con username = Janet, la URL se ve como localhost/?username=Janet y arroja un error. Pero si elimino manualmente "/? Username =" y mantengo localhost/Janet entonces muestra la página de inicio de mi aplicación.

He intentado jugar con el retorno RedirectToAction("Index","Home"); de mi método de registro pero no tuve suerte.

¿Alguien puede ayudar en esto y decirme qué estoy haciendo mal?

Configuración de ruta

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Username_Default", url: "{username}/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { username = new OwinUsernameConstraint() } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }

Restricción de nombre de usuario

public class OwinUsernameConstraint : IRouteConstraint { private object synclock = new object(); public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { if (parameterName == null) throw new ArgumentNullException("parameterName"); if (values == null) throw new ArgumentNullException("values"); object value; if (values.TryGetValue(parameterName, out value) && value != null) { string valueString = Convert.ToString(value, CultureInfo.InvariantCulture); return this.GetUsernameList(httpContext).Contains(valueString); } return false; } private IEnumerable<string> GetUsernameList(HttpContextBase httpContext) { string key = "UsernameConstraint.GetUsernameList"; var usernames = httpContext.Cache[key]; if (usernames == null) { lock (synclock) { usernames = httpContext.Cache[key]; if (usernames == null) { // Retrieve the list of usernames from the database using (var db = ApplicationDbContext.Create()) { usernames = (from users in db.Users select users.UserName).ToList(); } httpContext.Cache.Insert( key: key, value: usernames, dependencies: null, absoluteExpiration: Cache.NoAbsoluteExpiration, slidingExpiration: TimeSpan.FromSeconds(15), priority: CacheItemPriority.NotRemovable, onRemoveCallback: null); } } } return (IEnumerable<string>)usernames; } }

Controlador de registro

public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.UserName, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 // Send an email with this link // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=/"" + callbackUrl + "/">here</a>"); return RedirectToAction("Index","Home"); } AddErrors(result); } // If we got this far, something failed, redisplay form return View(model); }

Gracias