Контроллеры MVC - PullRequest
       3

Контроллеры MVC

0 голосов
/ 06 марта 2012

У меня есть контроллер, работающий в тот момент, когда URL появляется в данный момент Home/Collections/Collection?id=1, что было моей предполагаемой функциональностью. Однако теперь я хотел бы сделать URL-адрес более дружелюбным. Например, я бы хотел, чтобы он стал Home/Collections/Summer.

В моем CollectionsController есть следующий код:

    public ActionResult Index()
    {
        return View(Helper.Helper.ResolvePath("Collections"));
    }


    //
    // GET: /Collections/Collection?id=1
    public ActionResult Collection(int id)
    {
        var collectionModel = ds.GetCollection(id);
        return View(Helper.Helper.ResolvePath("Collection"), collectionModel);
    }

Что мне нужно изменить, чтобы получить желаемый результат? Без отдельной ActionResult для каждой коллекции (так как она никогда не будет фиксированным числом)?

А вот и мой Global.asax

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

Ответы [ 5 ]

2 голосов
/ 06 марта 2012

Вы можете определить маршрут как,

 routes.MapRoute(
            "Collections", // Route name
            "Collections/{name}/{id}", // URL with parameters
            new { controller = "Collections", action = "Collection" ,id = UrlParameter.Optional } // Parameter defaults
        );

Теперь в вашем CollectionsController,

public class CollectionsController : Controller
{      
    public ActionResult Collection(string name)
    {
      /// Your Logic here
      /// name is required parameter
      /// optionally you can add an id parameter
        return View();
    }

}

Теперь ваш URL будет выглядеть как "http://localhost:98765/Collections/Summer"

, но я не понимаюзачем вам Home в URL

1 голос
/ 06 марта 2012

С учетом следующего enum:

public enum Seasons { Summer = 1, Fall = 2, Winter = 3, Spring = 4 }

Добавить пользовательский маршрут к сопоставлениям маршрутов:

routes.MapRoute(
    "Default", // Route name
    "Home/Collections/{action}/{season}", // URL with parameters
        new { controller = "Collections",
              action = "Collection",
              season = UrlParameter.Optional } // Parameter defaults
);

Действие контроллера:

public ActionResult Collection(Season season)
{
    /* ... code ... */
}
0 голосов
/ 06 марта 2012

Наряду с Manas 'ответом вы можете иметь дополнительное «поле / столбец / свойство» в своей коллекции для хранения понятного для URL имени.

Не все имена будут действительными именами URL (например, если для вашей коллекции «50% скидка !!», вы непременно получите неожиданные результаты по URL http://server/Collections/50% Off !!)

Так что вы можете попробовать добавить «UrlFriendlyName» в свою коллекцию и автоматически сгенерировать его из официального названия:

public class Url
{
    public static string GetUrlFriendlyName(string name)
    {
        //Unwanted:  {UPPERCASE} ; / ? : @ & = + $ , . ! ~ * ' ( )
        name = name.ToLower();
        //Strip any unwanted characters
        name = Regex.Replace(name, @"[^a-z0-9_\s-]", "");
        //Clean multiple dashes or whitespaces
        name = Regex.Replace(name, @"[\s-]+", " ");
        //Convert whitespaces and underscore to dash
        name = Regex.Replace(name, @"[\s_]", "-");
        name = Regex.Replace(name, @"-+", "-");
        return name;
    }
}

Таким образом, вы можете запросить вашу коллекцию на основе понятного URL-адреса (в идеале, оно будет уникальным, но в игру вступит множество других проблем ... например, добавление идентификатора к URL-адресу (* 1013). * или добавление случайных чисел к понятному URL-имени, например http://server/Collections/Summer-123, или просто указание пользователю, создающему коллекцию, указать уникальное понятное URL-имя, начиная с автоматически сгенерированного, но возвращая его пользователю, если оно не уникально).

0 голосов
/ 06 марта 2012

чтобы иметь URL-адрес, подобный этому Home / Collections / Summer, у вас должен быть метод с именем "Summer", и там он может возвращать ActionResult с соответствующим идентификатором в Summer, например:

public ActionResult Summer() {
   return Collection(1); //where id 1 corresponds to summer
}
0 голосов
/ 06 марта 2012

Измените параметр id на строку и выполните любой запрос к базе данных, необходимый для поиска соответствующего идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...