ASP.NET MVC создание URL - PullRequest
       6

ASP.NET MVC создание URL

0 голосов
/ 07 февраля 2010

Прежде чем я задам свой вопрос: я только что запустил ASP.NET MVC, поэтому сложный ответ может быть трудно понять;)

У меня 3 таблицы (я добавлю лишь несколько полей ниже)

  • Магазины (ShopID, Имя)
  • Продукты (ProductID, Имя, ShopID)
  • Комментарии (CommentID, ProductID, UserID, CommentText)

Теперь я хочу сделать следующее:

www.site.com / Магазины

// Дает мне список магазинов

www.site.com / Магазины / ShopName

// Предоставляет мне некоторые сведения о магазине под названием ShopName и перечисляет все товары, которые есть в магазине

www.site.com / Магазины / ShopName / ProductName /

// Предоставляет мне все комментарии к этому продукту под названием ProductName из этого магазина под названием ShopName

www.site.com / Магазины / ShopName / ProductName / ASpecificCommentHere

// Дает мне конкретный комментарий об этом товаре этого магазина

и другие вещи, такие как

www.site.com / Магазины / ShopName / ProductName / AddComment

// Добавляет новый комментарий к этому продукту из этого магазина

Теперь у меня есть только ShopsController , который позволяет мне сделать что-то подобное сейчас:

www.site.com / Магазины /

// Дает мне список всех магазинов

и

www.site.com / Магазины / Подробности / 123

// Дает мне некоторые сведения о магазине с идентификатором 123 и должен перечислить его товары.

Но здесь также возникает первая проблема: мне не нужен идентификационный номер в URL-адресе, например / Shops / 123, а скорее имя / Shops / ShopName, и я не знаю, хорошо ли иметь / Details / там в URL. Может быть, / Shops / ShopName было бы лучше, если бы между ними не было деталей Details

Как мне это сделать? Должен ли я создать контроллер для моих продуктов и для моих комментариев, чтобы у меня было всего 3 контроллера? Или мне просто оставить один ShopController, чтобы всегда получать первую часть URL (чтобы он всегда начинался с) site.com/Shops/ShopName/...

Заранее спасибо

(и небольшой вопрос, нужно ли помещать ViewModels в каталог контроллеров?)

Ответы [ 2 ]

1 голос
/ 07 февраля 2010

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

Как вы уже наверняка знаете - порядок важен.

www.site.com / Магазины / ShopName / ProductName / AddComment =>

routes.MapRoute(
    "Product",
    "Shops/{shopName}/{productName}/{action}",
    new { controller="comment"}
);

www.site.com / Магазины / ShopName / ProductName / ASpecificCommentHere =>

routes.MapRoute(
    "Product",
    "Shops/{shopName}/{productName}/{commentName}",
    new { controller="comment", action="details"}
);

www.site.com / Магазины / ShopName / ProductName / AddProduct =>

routes.MapRoute(
    "Product",
    "Shops/{shopName}/{productName}/{action}",
    new { controller="product"}
);

www.site.com / Магазины / ShopName / ProductName / =>

routes.MapRoute(
    "Product",
    "Shops/{shopName}/{productName}",
    new { controller="product", action = "details"}
);

www.site.com / Магазины / ShopName =>

routes.MapRoute(
    "ShopDetails",
    "Shops/{shopName}",
    new { controller="shop", action = "details"}
);

www.site.com / Магазины ( NB : этот маршрут является «глобальным» для каждого контроллера) =>

routes.MapRoute(
    "List",
    "{controller}",
    new { action = "list"}
);

Может быть, это может быть оптимизировано или хуже - это неправильно, но это должно дать вам некоторое лучшее понимание наверняка.

Не забудьте назвать магазины / контроллеры / комментарии как соответствующие действиям контроллера. Это проблема с этим подходом к маршрутизации.

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

Еще один совет - читайте о привязке модели. Используя пользовательские связыватели, вы можете заменить строковые параметры (имена сущностей) фактическими уже собранными объектами. Возможно, в данном конкретном случае это не имеет смысла, но привязка модели, безусловно, является второй важной и трудной вещью для понимания при взгляде на asp.net mvc.

И я солгал, я бы не стал этого делать, потому что я предпочитаю указывать специфические для контроллера маршруты, используя атрибуты непосредственно для действий (опущено, потому что это кажется более advanced).

Маршрутизация похожа на регулярные выражения. Есть момент, когда он просто «щелкает» и кажется естественным и легким.


Уже ответил на второй вопрос как комментарий к вашему вопросу. :)

0 голосов
/ 07 февраля 2010

Я бы потратил немного времени на исследование механизма маршрутизации в MVC. Здесь вы устанавливаете форматы для URL, которые должно получать ваше приложение. Все, что вы упомянули, возможно ... вам просто нужно соответствующим образом составить определения маршрута. Что касается возможности принять имя объекта, а не ID, вы можете сделать это очень легко, создав маршрут так, чтобы он принимал имена и изменял подписи в ваших методах действия, чтобы принимать строки вместо целых.

Я не знаю, какова официальная позиция относительно того, где должны быть расположены ViewModels. Это действительно зависит от вас, и это зависит от метода ORM, который вы реализуете. Я использую LINQ-to-SQL и хорошо провожу время с ним. Я храню свою модель LINQ-to-SQL в своей папке Models. Я предпочитаю хранить мои ViewModels в подпапке View в моей папке Models. У меня также есть подпапка «Домен» для хранения частичных моделей для моих сущностей, на случай, если я захочу реализовать вычисляемые поля или установить начальные значения для записи.

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