ASP.NET Routing - ограничение маршрута с поиском в базе данных - PullRequest
2 голосов
/ 25 августа 2010

Я только начинаю с C # и ASP.NET, и у меня есть следующие вопросы.Я работаю с кодом, адаптированным из пары разных руководств, играющих с Northwind, и зашел так далеко.Список допустимых категорий в настоящее время жестко запрограммирован в виде строки, но я хотел бы найти CategoryName в базе данных, чтобы убедиться, что он существует.

Очевидно, что цель этого состоит в том, чтобы пользователи не просто набирали:
www.domain.com / Categories / AnyUrlWillWork и возвращали действительную страницу.

Также у кого-нибудь есть советы о том, как они решают проблемы с капитализацией, поскольку маршрутизация чувствительна к регистру?Например, Категории / напитки следует переслать до Категории / Напитки ?

Заранее благодарен за любую помощь и рад присоединиться к переполнению стека.

//Complex contraint class
public class EchoConstraint : IRouteConstraint
{
    public readonly string[] ValidMessages = { "Beverages", "Produce", "Confections", "Seafood" };

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        string message = values["CategoryName"] as string;
        return ValidMessages.Contains(message);
    }
}


//Routes
RouteTable.Routes.MapPageRoute(
                        "Category Route",                       // Route name
                        "Categories/{CategoryName}",            // Url pattern
                        "~/ShowProductsInCategory.aspx",        // Physical file
                        true,
                        new RouteValueDictionary            
                            {{"CategoryName", "Beverages"}},         //Sets default value if none is provided in URL
                        new RouteValueDictionary 
                            {{"CategoryName", new EchoConstraint()}}
                           );

1 Ответ

2 голосов
/ 25 августа 2010

Это MVC?Если так, то почему бы не направить функцию, которая проверит имя категории по вашему хранилищу данных и перенаправит на страницу с ошибкой, если такая категория не существует?

public ActionResult Index(string catName)
{
    if (string.IsNullOrEmpty(catName) || !MyCategoriesDataStore.Exists(catName))
        return RedirectToAction("CategoryError");

    // Load category data to be used from View

    return View();
}

Решение WebForms будет следующим:

    public class EchoConstraint : IRouteConstraint
    {
        private IRepository rep;
        public EchoConstraint(IRepository r) { rep = r; }

        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            return rep.GetCategory(message) == 0;
        }
    }
.
.
.
                        new RouteValueDictionary 
                            {{"CategoryName", new EchoConstraint(myDataAccessRepo)}}
                           );

Где вы передаете объект класса, реализующего IRepository, с вашей логикой доступа к данным (используя NHibernate, EntityFramework или вашу собственную реализацию DAL).Вам нужно вернуть значение bool, и это то, что я сделал.

...