как сопоставить маршрут как (site.com/username) в MVC 3 - PullRequest
4 голосов
/ 02 июля 2011

Я хочу отобразить маршрут следующим образом:

mysite.com / username

в приложении ASP.NET MVC 3;Как я могу это сделать, пожалуйста?Спасибо всем, с уважением

Ответы [ 2 ]

2 голосов
/ 03 июля 2011

Может быть, в самом начале добавить пользовательский маршрут, который будет наследоваться от System.Web.Routing.Route, и переопределить метод

protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint, 
   string parameterName, RouteValueDictionary values, RouteDirection routeDirection)

, где вы будете проверять в БД, используя индексированный столбец.

Просто добавьте некоторый необнуляемый объект ограничения, такой как

Constraints = new { username = "*" }

, чтобы объект маршрута обрабатывал ограничения.

Перед попаданием в базу данных, возможно, сделайте некоторую эвристику, может ли это быть имя пользователя.Помните, что у вас не может быть такого же пользователя, как у контроллера (при наличии действия по умолчанию), поэтому вы хотите как-то ограничить его.Обратите внимание, если это не повредит годовой производительности, но у вас, вероятно, не много маршрутов с одним значением после косой черты.

Вот как вы можете это сделать.

public class UserRoute : Route
{
    public UserRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
        : base(url, defaults, constraints, routeHandler)
    {
    }

    protected override bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (routeDirection == RouteDirection.UrlGeneration)
            return true;

        object value;
        values.TryGetValue(parameterName, out value);
        string input = Convert.ToString(value, CultureInfo.InvariantCulture);
        // check db
        if (!CheckHeuristicIfCanBeUserName(input))
        {
            return false;
        }

        // check in db if exists, 
        // if yes then return true
        // if not return false - so that processing of routing goes further
        return new[] {"Javad_Amiry", "llapinski"}.Contains(input);
    }

    private bool CheckHeuristicIfCanBeUserName(string input)
    {
        return !string.IsNullOrEmpty(input);
    }
}

Это добавление в начале.

routes.Add(new UserRoute("{username}", 
            new RouteValueDictionary(){ {"controller", "Home"}, {"action", "About"}}, 
            new RouteValueDictionary(){ { "username", "*" }}, new MvcRouteHandler()));

Работает для меня обоими способами, генерируя и поступая.

1 голос
/ 02 июля 2011

Может быть, что-то вроде этого?

routes.MapRoute(
    "Profile",
    "{username}",
    new { controller = "Profile", action = "View" }
);

С вашим контроллером

public class ProfileController : Controller {

    public ActionResult View(string username) {
       // ...
    }

}
...