Атрибут маршрутизации с числом параметров 404 не найден

Я использую AttributeRouting, чтобы установить конкретный маршрут для моего ActionResult. Я получил страницу 404, не найденную, когда у меня есть эта конфигурация:

[GET("Tender/SubmitBid/{id}/{bidId}")]
public ActionResult SubmitBid(string id, string bidId)
{ 
 ...
 return View(model);
}

@using ("SubmitBid", "Tender", new { id = Model.TenderId, bidId = Model.BidId }, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
 ...    
 <button type="submit">Save</button>
}

// 404 not found
[HttpPost]
public ActionResult SubmitBid(BidViewModel model)
{
 ...
}

Я установил URL-сниффер, чтобы увидеть URL-триггер, страница 404 не найдена, и я получил это: http... / Tender / SubmitBid / 1/0

Он должен работать... но мне нужно удалить последние параметры, чтобы получить ActionResult, и я не знаю почему.

Спасибо за помощь,

Карине

Изменить Если я удалю атрибут [GET("Tender/SubmitBid/{id}/{bidId}")], страница будет доступна для запроса POST. Но URL-адрес похож на http...//Tender/SubmitBid/1? BidId=0

1 ответ

Решение

Вам не нужны параметры строки запроса, так как они существуют в BidViewModel Вы отправляете. Смысл запроса POST заключается в том, что у вас нет параметров строки запроса.

Я думаю, что вы должны использовать эту перегрузку Html.BeginForm метод:

@using (Html.BeginForm("SubmitBid", "Tender", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.HiddenFor(model => model.Id)
    @Html.HiddenFor(model => model.BidId)

    // Other properties..

    <button type="submit">Save</button>
}

Теперь он будет публиковать в http:localhost/Tender/SubmitBid со свойствами BidViewModel в качестве почтовых значений, которые содержат Id а также BidId, Подпись действия POST может остаться прежней:

[HttpPost]
public ActionResult SubmitBid(BidViewModel model)
{
    string id = model.Id;
    string bidId =  model.bidId;

    // ...
}

Также возможно, что AttributeRouting вызывает эту проблему. Можете ли вы попробовать это с нативной маршрутизацией ASP.NET MVC? Вы можете использовать этот конкретный маршрут для подачи заявок:

routes.MapRoute(
    name: "SubmitBid",
    url: "Tender/SubmitBid/{id}/{bidId}/",
    defaults: new 
                { 
                    controller = "Tender", 
                    action = "SubmitBid", 
                    id = UrlParameter.Optional, 
                    bidId = UrlParameter.Optional 
                });
Другие вопросы по тегам