Нужна помощь в разработке методов действия ASP.NET MVC - PullRequest
0 голосов
/ 17 апреля 2011

Я только начинаю изучать ASP.NET MVC 3. Я изучал образец музыкального магазина на веб-сайте ASP.NET, а также начал разрабатывать свой собственный сайт, но у меня возникли некоторые проблемы понимание того, как я должен настроить методы действия моего контроллера.

На моем сайте каждый зарегистрированный пользователь сможет выполнять стандартные операции CRUD в своих проектах. Я настроил это подобно образцу Music Store со следующими методами действия в ProjectController. Пока это имеет смысл для меня.

ActionMethod                                          View
ProjectController.Index()                            Lists the active users's projects
ProjectController.Details(int id)                    Shows details for project 123
ProjectController.Create()                           Shows a form to edit a new project
ProjectController.Create(FormCollection col)         Adds a new project with the form contents
ProjectController.Edit()                             Shows a form to edit a new project
ProjectController.Edit(int id, FormCollection col)   Adds a new project with the form contents
ProjectController.Deiete(int id)                     Shows a delete confirmation form
ProjectController.Delete(int id, FormCollection col) Deletes a project with the provided id.

Кроме того, пользователи смогут добавлять элементы в каждый проект. Элементы не могут существовать сами по себе и должны быть связаны с проектом при создании. У меня возникли проблемы с пониманием, как передать ссылку на проект, в котором должен быть создан Item. Например, в моем контроллере элементов у меня есть пара методов действия Create (), аналогичных описанному выше.

ItemController.Create()                               Shows a form to create a new item
ItemController.Create(FormCollection col)             Creates a new item with the details from the form.

Пока я не понимаю, как первый метод Create () передает ссылку на проект, в котором должен быть создан новый Item, поскольку вспомогательный метод View () может принимать только один параметр объекта. Должен ли я просто добавить ссылку на проект в свойство ViewBag? Я новичок в динамических типах, и ViewBag кажется мне просто волшебным. Так что я немного не решаюсь его использовать. Я также всегда думал, что строго типизированный дизайн лучше. Поэтому я должен создать отдельный объект модели "NewItemData", который содержит ссылку на новый элемент, а также на проект, к которому он добавляется?

Как только форма узнает, в какой проект она добавляет элемент, как она должна передавать эту информацию при отправке? Должно ли в форме быть скрытое поле «ProjectID»? Или форма POST возвращается к URL с идентификатором проекта в строке запроса?

www.mysite.com/Item/Create?ProjectID=1234 

Наконец, я также хочу иметь возможность перечислять элементы, которые добавляются в каждый проект. Должно ли это быть частью ItemController или ProjectController. Ради простоты я придерживаюсь стандартной маршрутизации URL Controller \ Action [ID]. Некоторые из моих идей перечислены ниже. Я склоняюсь к последнему варианту, но очень хотел бы услышать, что думают другие с большим опытом работы с этим материалом.

Action Method                          URL
ItemController.Index(int ProjectID)    \Item?ProjectID=1234    
ItemController.List(int id)            \Item\List\1234         
ProjectController.Items(int id)       \Project\Items\1234

Ответы [ 2 ]

0 голосов
/ 17 апреля 2011

Чтобы ответить на ваш последний вопрос, это зависит. Существуют ли элементы в вашей модели независимо от проекта? Если ответ «нет», то я хотел бы сделать

ProjectController.AddItem(int id)
ProjectController.Items(int id)

где id представляет идентификатор проекта.

Названия параметров, которые вы используете в сигнатуре действия, напрямую соответствуют значениям из перенаправленных данных и значений запроса. {controller} / {action} / {id} - это шаблон, в котором имена в скобках используются в качестве ключей в словаре маршрутов. Если вы хотите, вы можете изменить маршруты на {controller} / {action} / {projectid} для этого действия, а сигнатурой вашего метода может быть (int projectid) подпись.

Я не рекомендую вам делать это только для того, чтобы получить отличные подписи. Вместо этого используйте комментарии, если вы думаете, что люди запутаются.

Без изменения шаблона маршрута, если вы предпочитаете, чтобы ваши URL были / project / items? Projectid = 3, чем / project / items / 3, тогда действие будет таким:

ProjectController.Items(int projectId)

Мне нравятся более симпатичные URL, поэтому я бы лучше использовал версию id. При этом, если бы Предметы не существовали независимо от объекта Project, я бы с большей вероятностью это сделал. Однако, если у вас будет TON различных действий, которые могут быть выполнены с Item, имеет смысл разделить их на ItemController и ProjectController.

В значительной степени речь идет о том, что имеет смысл для вашего приложения, и о том, сколько действий, по вашему мнению, должен выполнять контроллер.

0 голосов
/ 17 апреля 2011

В этом случае вы создадите скрытое поле с name=projectId, а затем в вашем контроллере Create будет метод действия.

[HttpPost]
public ActionResult Create( int projectId, FormCollection postData )

Обычно вы также используете строго типизированную модель представления, поэтому вместо этогопараметр FormCollection использует:

[HttpPost]
public ActionResult Create( int projectId, Item or ItemViewModel postData )

И до тех пор, пока атрибуты name соответствуют свойствам Item или ItemViewModel, ModelBinder MVC будет заботиться о увлажнении этих значений.

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