Ответ 1
Здесь есть несколько разных вопросов, которые, вероятно, должны быть разделены, но я думаю, что это покрывает основную часть ваших проблем.
Зачем создавать имена для действий и маршрутов? Какая разница между именами действий и именами маршрутов?
Прежде всего, действия и маршруты очень разные.
Действие работает на контроллере. Маршрут определяет полную конечную точку, состоящую из контроллера и действия и потенциально дополнительных параметров маршрута.
Вы можете указать имя маршрута, что позволяет вам ссылаться на него в приложении. например
routes.MapRoute(
name: "MyRouteName",
url: "SomePrefix/{action}/{id}",
defaults: new { controller = "Section", action = "Index" }
);
Причины имен действий рассматриваются в этом вопросе: Цель ActionName
Это позволяет вам начинать действие с номера или включать любой символ, который .net не разрешает в идентификаторе. - Наиболее распространенная причина заключается в том, что он позволяет иметь две действия с одной и той же сигнатурой (см. Действия GET/POST Delete любого контроллера леса)
Каковы основные отличия этих функций?
Эти 3 функции выполняют по существу одну и ту же функцию - возвращают ответ 201 Created
с заголовком Location
, указывающим на url для вновь созданного ответа, и сам объект в теле. URL-адрес должен быть URL-адресом, по которому запрос GET возвращает URL-адрес объекта. Это будет считаться "правильным" поведением в системе RESTful.
Для примера Почтового кода в вашем вопросе вы действительно хотели бы использовать CreatedAtAction
.
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{
// actual insertion code left out
return CreatedAtAction("MyStuff", new { id = myStuff.Id }, myStuff);
}
Предполагая, что вы настроили маршрут по умолчанию, это добавит заголовок Location, указывающий на действие MyStuff
на том же контроллере.
Если вы хотите, чтобы URL-адрес местоположения указывал на определенный маршрут (как мы определили ранее, вы можете использовать, например,
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{
// actual insertion code left out
return CreatedAtRoute("MyRouteName", new { id = myStuff.Id }, myStuff);
}
Могу ли я использовать этот вариант и предоставить фиктивный URL-адрес и вернуть объект, который я хочу, и выполнить его с помощью?
Если вы действительно не хотите использовать CreatedResult
, вы можете использовать простой StatusCodeResult
, который вернет 201, без заголовка Location
.
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{
// actual insertion code left out
return StatusCode(201);
}