Ядро ASP.net, как отобразить сообщение и поставить маршрут запроса на HTTP:// сайт / область / контроллер

Я собираюсь сопоставить свой пост и поставить запрос на URL http://site/area/controllerи я использовал HttpPost а также HttpPut атрибутов.

Но когда я отправляю данные на сервер, он возвращает 404 Не найдено.

Мой код:

public class ApplicationsController : Controller
{
    private readonly IApplicationService _applicationService;

    public ApplicationsController(IApplicationService applicationService)
    {
        _applicationService = applicationService;
    }

    [HttpGet]
    public async Task<IActionResult> Index(ApplicationQuery query)
    {
        var permissionNodes = await _applicationService.SelectePagedApplicationsAsync(query);
        ViewData["Query"] = query;
        return View(permissionNodes.Data);
    }

    [HttpPost("/Applications")]
    public async Task<IActionResult> Create(ApplicationViewModel model)
    {
        var app = Mapper.Map<Application>(model);
        var result = await _applicationService.CreateApplicationAsync(app);
        ViewData["ServiceResult"] = result;
        return View(nameof(Edit));
    }

    [HttpPut("/Applications")]
    public async Task<IActionResult> Update(ApplicationViewModel model)
    {
        var app = Mapper.Map<Application>(model);
        var result = await _applicationService.CreateApplicationAsync(app);
        ViewData["ServiceResult"] = result;
        return View(nameof(Edit));
    }

    [HttpGet]
    public async Task<IActionResult> Edit(long? id)
    {
        var result = await _applicationService.FindApplicationAsync(new ApplicationQuery
        {
            Id = id
        });
        var model = Mapper.Map<ApplicationViewModel>(result.Data);
        return View(model);
    }

Как заставить MVC сопоставить мой запрос с моим действием?

1 ответ

Решение

Похоже, вы пропускаете токены для указанных маршрутов.

Замена токенов в шаблонах маршрутов ([контроллер], [действие], [область])

Для удобства атрибуты маршрутов поддерживают замену токенов, заключая их в квадратные скобки ([, ]). Жетоны [action], [area], а также [controller] будут заменены значениями имени действия, имени области и имени контроллера из действия, в котором определен маршрут.

Видя, как вы хотите изолировать эти маршруты только к POST а также PUT конечные точки обновляют маршруты соответственно

public class ApplicationsController : Controller {

    //...code removed for brevity

    //Matches POST /{area}/applications
    [HttpPost("[area]/[controller]")]
    public async Task<IActionResult> Create([FromBody]ApplicationViewModel model) {
        //...code removed for brevity
    }

    //Matches PUT /{area}/applications
    [HttpPut("[area]/[controller]")]
    public async Task<IActionResult> Update([FromBody]ApplicationViewModel model) {
        //...code removed for brevity
    }

    //...code removed for brevity
}

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

Ссылка маршрутизации на действия контроллера

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