ASP.NET MVC URL-маршрутизация - PullRequest
       8

ASP.NET MVC URL-маршрутизация

0 голосов
/ 22 сентября 2011

У меня есть вопрос, можно ли это сделать с помощью ASP.NET MVC (Razor и MapRoute)?

Пример

  • Category/ - вызывает функцию контроллера категории и индекса контроллера
  • Category/{State_name} - вызывает функцию контроллера "Категория и города" (State_id), возвращает все города в этом состоянии.

То есть URL-адрес отображает название штата, но функция городов получает идентификатор состояния?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Да, можете, попробуйте

public class CategoryController : Controller {

    // GET: /Category/
    // OR
    // GET: /Category/State_name
    public ActionResult Index(string State_name) {
        if (!string.IsNullOrWhiteSpace(State_name)) {
            int? State_id = FindStateIdFromStateName(State_name); // retrive state_id from datastore where state_name == State_name
            if (State_id.HasValue) { // means the currect state_name passed to action
                var model = FindStateById(State_id.Value);
                return View("Cities", model); // will renders Cities.cshtml with specified model
            } else {
                // means the specified state_name not found! u can do something else, or allow continue bellow lines
            }
        }
        return View(); // will render normal Index.cshtml
    }

}

Дайте мне знать, если у вас есть какие-либо вопросы или вам нужны разъяснения по любой части.

UPDATE

У меня есть одна проблема с путём! Вы получаете идентификатор из базы данных с помощью State_name, а затем получаете модель из базы данных с помощью State_name! Почему бы не получить модель из БД по State_name в первый раз? смотри:

public class CategoryController : Controller {

    // GET: /Category/
    // OR
    // GET: /Category/State_name
    public ActionResult Index(string State_name) {
        if (!string.IsNullOrWhiteSpace(State_name)) {
            var model = FindStateByName(State_name);
            if(model != null)
                return View("Cities", model);
            else
                // means the specified state_name not found! u can do something else, or allow continue bellow lines
        }
        return View(); // will render normal Index.cshtml
    }

}

и если вы находитесь на EF, то вы можете создать этот метод:

public State FindStateByName(state_name){
    using(var context = new YourEntityContext()){
         return context.States.SingleOrDefault(s => s.Name.ToLower() == state_name.ToLower());
    }
}

Почему бы не использовать этот способ?

2 голосов
/ 22 сентября 2011

Это должно сделать это:

routes.MapRoute("Category_byState", "Category/{State_id}", new { controller = "Category", action = "Cities" });
...