Как создать Ror стиль Restful маршрутизации в Asp.net MVC Web Api

Как настроить маршрутизацию в asp.net web api, чтобы я мог кодировать следующие действия в своем унаследованном классе ApiController?

| ================================================= ===================================== |
|Http Глагол|Путь|Действие|Используется для|
| ================================================= ===================================== |
| ПОЛУЧИТЬ | / фотографии | индекс | отобразить список всех фотографий |
| ПОЛУЧИТЬ | / фото / новый | новый | вернуть HTML-форму для создания новой фотографии |
| ПОСТ | / фотографии / | создать | создать новое фото |
| ПОЛУЧИТЬ | / фотографии /:id      | показать | показать конкретную фотографию |
| ПОЛУЧИТЬ | /photos/:id/edit | редактировать | вернуть HTML-форму для редактирования фото |
| PUT     | / фотографии /:id      | обновление | обновить конкретную фотографию |
| УДАЛИТЬ | / фотографии /:id      | уничтожить | удалить конкретную фотографию |

2 ответа

Решение

Ниже мое собственное рабочее решение для этого:
// Конфигурация маршрута:

//GET     | /photos          |  index   | display a list of all photos    
config.Routes.MapHttpRoute(
    name: "DefaultIndex",
    routeTemplate: "api/{controller}",
    defaults: new {action = "Index"},
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

//POST    | /photos/         |  create  | create a new photo
config.Routes.MapHttpRoute(
    name: "DefaultCreate",
    routeTemplate: "api/{controller}",
    defaults: new { action = "Create" },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }
);

//GET     | /photos/new      |  new     | return an HTML form for creating a new photo |
config.Routes.MapHttpRoute(
    name: "DefaultNew",
    routeTemplate: "api/{controller}/new",
    defaults: new { action = "New" },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

//GET     | /photos/:id      |  show    | display a specific photo    
config.Routes.MapHttpRoute(
    name: "DefaultShow",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action = "Show" },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

//PUT     | /photos/:id      |  update  | update a specific photo   
config.Routes.MapHttpRoute(
    name: "DefaultUpdate",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action = "Update" },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) }
);

//DELETE  | /photos/:id      |  destroy | delete a specific photo 
config.Routes.MapHttpRoute(
    name: "DefaultDestroy",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action = "Destroy" },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) }
);

config.Routes.MapHttpRoute(
    name: "DefaultEdit",
    routeTemplate: "api/{controller}/{id}/edit",
    defaults: new { action = "Edit" },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

// Действия ApiController

// GET api/photo
[ActionName("Index")]
public string Get()
{
    return "Index Action called";
}


// GET api/photos/5
[ActionName("Show")]
public string Get(int id)
{
    return "Show action called"
}

// GET api/photos/5/edit
[HttpGet]
public string Edit(int id)
{
    return "Edit action called";
}

// POST api/photos
[ActionName("Create")]
public void Post([FromBody]string value)
{

}

// GET api/photos/new
[HttpGet]
public string New()
{
    return "New called";
}

// PUT api/photos/5
[ActionName("Update")]
public void Put(int id, [FromBody]string value)
{
}

// DELETE api/photos/5
[ActionName("Destroy")]
public void Delete(int id)
{
}

Я нашел http://restfulrouting.com/ очень полезным. Это позволяет вложенные ресурсы тоже.

Другие вопросы по тегам