2010-09-24 2 views
2

Если это дубликат, сообщите мне, потому что я быстро посмотрел и не смог найти ничего, что действительно отвечает на мой вопрос.ASP.NET MVC - Как создать схему контроллера RESTful?

Я экспериментировал с ASP.NET MVC 2. Теперь приходит из фона веб-форм, я только действительно занимался HTTP GET и HTTP POST.

Я пытаюсь понять, как я мог бы применить GET/PUT/POST/DELETE к соответствующему CRUD операции на моем хранилище (Find, Insert, Update, Удалить).

Скажем у меня есть один контроллер, со следующими методами действий:

[HttpGet] // GET: /Products/{id} 
[ActionName("Products") 
public ActionResult Get(int id = 0) { ... } 

[HttpPut] // PUT: /Products 
[ActionName("Products") 
public ActionResult Put(Product product) { ... } 

[HttpPost] // POST: /Products/{product} 
[ActionName("Products") 
public ActionResult Post(Product product) { ... } 

[HttpDelete] // DELETE: /Products/{product} 
[ActionName("Products") 
public ActionResult Delete(Product product) { .. } 

Пара вопросов о том, что - это то, как вы называете бы/отдельные методы действий? Должен ли я проходить через всю модель (Продукт) или просто идентификатор?

Проблема у меня есть, я не уверен, как обращаться с , ссылаясь на эти методы действий с соответствующим HTTP-глаголом в моем представлении.

На данном этапе, я думаю, я бы 3 Просмотров:

  1. «Индекс» - привязку к IEnumerable<Product> модели, список всех продуктов с «Edit», «Подробности» и «Удалить "ссылки
  2. " Отдельный "- привязать к одной модели Product, в котором перечислены все детали продукта, с кнопкой« Обновить ».
  3. «New» - привязать к одной модели Product, с формой для создания продукта, с кнопкой «Создать».

Итак - мой вопрос в том, как я могу указать, что я хочу вызвать конкретный метод контроллера с определенным HTTP-глаголом?

С Html.BeginForm вы можете указать перечисление FormMethod - но у него есть только GET и POST.

  • Как я могу выполнить команду PUT и DELETE?
  • Мне нужен отдельный просмотр для каждого HTTP-глагола?
  • Если у меня есть ссылка под названием «Удалить», могу ли я вызвать команду HTTP DELETE для моего контроллера или ее нужно перенаправить на новый вид с удалением формы?

Или, это глупый дизайн, в первую очередь, должен ли я просто придерживаться «GET» и «POST»?

Я (довольно) новый для этого стиля веб-разработки (REST), поэтому, пожалуйста, будьте добрыми.:)

UPDATE

Так я наткнулся на интересную статью this от Стивена Walther, об этой самой теме.

Он указывает, что форма HTML поддерживает только GET и POST (потому что я новичок в веб-разработке REST-стиля, я даже не знал об этом, к которому я частично стыжусь).

По-видимому, единственный способ вызвать действие контроллера с помощью PUT/DELETE - сделать это с помощью AJAX. Шутки в сторону?

Так что я должен делать здесь, должен ли я придерживаться GET/POST, или мне нужно создать файл JavaScript, который обертывает базовый код XmlHttpRequest за хорошую функцию?

В каком направлении работают разработчики ASP.NET MVC? Наверняка кто-то задал себе тот же вопрос.

+1

re not know GET и POST являются единственными, широко поддерживаемыми для HTML-форм, очень распространенными, поэтому не беспокойтесь, что вы этого не знали :) – eglasius

ответ

4

Причина, по которой вы в основном знакомы с GET и POST, состоит в том, что обычный старый браузер может только GET или POST URL, особенно при отправке формы.

Настройка ваших контроллеров таким образом, вы смотрите на что-то большее по линиям REST API по сравнению с веб-сайтом, по крайней мере, по духу.

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

Вот что. Если вы строите современное веб-приложение, вы, вероятно, используете AJAX и не слишком догматичны, вы должны ожидать, что ваши пользователи будут иметь JavaScript. Если вы хотите сделать CRUD без AJAX, вы всегда можете POST-продукт или использовать GET для метода удаления с идентификатором в URL-адресе (остерегайтесь этого, убедитесь, что метод Delete защищен за авторизацией или веб-искатель с удовольствием потребляет ваши GET и удалите все ваши данные ...)

Если вы не хотите создавать REST API, тогда не потейте тот факт, что вы не используете DELETE (просто используйте GET с идентификатором в URL-адресе) или вы не используете PUT (просто используйте POST с объектом продукта в теле POST).

REST - отличный стиль для создания API (без уровня представления, данные, отправленные в необработанном формате клиентам, которые их потребляют, могут быть телефоном или веб-сайтом и т. Д.) Через HTTP. HTTP отлично подходит для создания веб-страниц. Используйте то, что вам нужно для того, что вам нужно.

Если вы хотите создать REST API, который будет использоваться как другими людьми, так и вашим веб-сайтом, тогда сделайте это, и просто попросите методы действий контроллера вашего сайта напрямую обращаться к вашим API-методам. Я делаю это все время. Используйте веб-клиент, такой как Hammock, чтобы облегчить вам работу.

+1

+1 для a) хороший ответ, и b) кто-то наконец отвечая, хе-хе. только point id make, я скорее сделаю DELETE с POST, а не GET. Принципы REST диктуют, что GET должен быть развязан снова и снова без изменения «состояния». Тем не менее, я, вероятно, склоняюсь к AJAX на этом этапе, потому что на этом сайте будет много. Цените свой ответ. – RPM1984

+0

@ RPM1984 вы правы, DELETE Должно быть сделано с POST, а не GET. – eglasius

+0

Вы не должны делать GET для НИЧЕГО, изменяющего данные. GET - это просто поиск. Если ваше действие связано с C, U или D (Создать, обновить или Удалить), вы должны вызвать с помощью POST. Слишком много шансов на повреждение данных, если все, что требуется, - это ПОЛУЧИТЬ, чтобы изменить ситуацию. – andymeadows

0

Лично я придерживаюсь как можно более полных запросов, вместо того, чтобы переходить на AJAX. Я использую ajax, но в определенных местах, где он увеличивает опыт (и я делаю это с прогрессивным javascript-подходом).

Из-за вышеизложенного, я всегда использую GET и POST.

Что касается имен, для тех, что я сделал бы: Get, Update, Create, Delete, что делает его довольно понятным. Я фактически использую больше как имя действия, связанное с тем, что делает операция, но для простых вещей они работают нормально.

+1

Спасибо за ответ. Я с тобой согласен. На этом этапе я просто занимаюсь R & D, поэтому я не собираюсь решать AJAX vs. GET & POST. Я согласен, решение по AJAX должно быть сделано на основе UX, не пытаясь придерживаться семантики HTTP. – RPM1984

0
+0

Уход за элобаратом? (да, я прочитал страницу MSDN). Вы использовали это в MVC? Как? Во всяком случае, теперь, когда я обнаружил, что формы поддерживают только GET/POST (до тех пор, пока не будет HTML5), я не вижу, как это будет работать. – RPM1984

+0

<% = Html.HttpMethodOverride (HttpVerbs.Put)%> <% = Html.HttpMethodOverride (HttpVerbs.Delete)%> – takepara

+0

чувак, прежде всего, не помещайте код в комментарии - отредактируйте свой ответ и поместите его туда , Во-вторых, это не разработка или объяснение того, как этот код мог бы работать (о чем идет речь этот вопрос). Тем не менее, я сделаю собственное исследование этого метода. – RPM1984

 Смежные вопросы

  • Нет связанных вопросов^_^