2017-02-08 1 views
2

Я использую ASP.net MVC5 и у меня есть следующие:Route Атрибут не производит довольно URL-

[Route("Edit/{id}")] 
[HttpGet] 
public ActionResult Edit(int id) 
{ 
    // do stuff 
    return View(viewModel); 
} 

[Route("Edit")] 
[HttpPost] 
public ActionResult Edit(DraftViewModel draft) 
{ 
    if (!ModelState.IsValid) return View(draft); 
    // do stuff 
    return RedirectToAction("Index"); 
} 

Я ожидал, что это производит довольно URL, как это:

Проект/Edit/5

вместо этого я получаю это:

Draft/Edit? Id = 5

Почему это? Как получить красивые URL-адреса с маршрутизацией на основе атрибутов? Код, который создает связь с уродливыми URL, заключается в следующем:

@Html.ActionLink("Edit", "Edit", "Draft", new { id = draft.Id }, new { @class = "btn btn-primary btn-xs" }) 

UPDATE

Когда я удалить [POST] Action и только [GET] (не полезно, конечно), URL-адрес на GET выглядит довольно! Таким образом, это когда у меня есть два маршрута с одним и тем же именем (но разные глаголы), с которыми работает рама!

+2

Что производит 'Проект/Edit ID = 5'? Можете ли вы поделиться этим кодом? – Shyju

+0

@Shyju Я добавил, что код – Ciwan

ответ

2

Убедитесь, что маршрутизация атрибут был включен в RouteConfig до того конвенции на основе маршрутов

routes.MapMvcAttributeRoutes(); 

Как вы уже открыли для себя, когда у вас есть действие POST с различными параметрами, чтобы получить таблицу маршрутизации использует другой формат при генерируя URL-адреса, поскольку инфраструктура ASP.NET MVC использует соглашение.

Если вы обновите шаблон URL-адреса действия POST в соответствии с форматом GET, он будет работать по желанию.

[Route("Edit/{id:int}")] 
[HttpGet] 
public ActionResult Edit(int id) { 
    // do stuff 
    return View(viewModel); 
} 

[Route("Edit/{id:int?}")] 
[HttpPost] 
public ActionResult Edit(DraftViewModel draft) { 
    if (!ModelState.IsValid) return View(draft); 
    // do stuff 
    return RedirectToAction("Index"); 
} 

Создание параметра POST маршрут шаблон id опционально позволяет не обновлять подпись действий.

Результирующий URL из ...

@Html.ActionLink("Edit", "Edit", "Draft", new { id = draft.Id }, new { @class = "btn btn-primary btn-xs" }) 

будет

Проект/Edit/5

+0

Спасибо @Nkosi! Зачем мне нужно снова передавать идентификатор '' [HttpPost] Edit'? – Ciwan

+1

@Ciwan - Технически, вы этого не делаете. При использовании атрибутов порядок, по которому они помещаются в таблицу маршрутов, по умолчанию не определен. Вы могли бы либо использовать решение Nkosi для решения этой проблемы, либо вы можете поместить атрибут 'Order' в каждый атрибут [[Маршрут]], чтобы указать, какой заказ они отправляют в таблице маршрутов. См. Http://rion.io/2015/11/13/understanding-routing-precedence-in-asp-net-mvc/. Однако вы его решаете, определенные маршруты должны быть в таблице сначала перед общими маршрутами. – NightOwl888

+0

@Ciwan NightOwl - это правильно. Я полностью упустил свойство 'Order'' RoutAttribute'. – Nkosi

0

Атрибут маршрутизации работает большинство времени. Но одним из основных недостатков использования маршрутизации атрибутов является то, что order of attributes are undefined. Поскольку в маршрутизации MVC порядок маршрутов, которые помещаются в таблицу маршрутов, имеет решающее значение для правильной работы, вам необходимо убедиться, что вы используете свойство Order атрибута [Route], когда они неоднозначны.

В маршрутизации первый матч всегда побеждает, поэтому абсолютно необходимо разместить specific routes before general routes в таблице маршрутов.

[Route("Edit/{id}", Order = 1)] 
[HttpGet] 
public ActionResult Edit(int id) 
{ 
    // do stuff 
    return View(viewModel); 
} 

[Route("Edit", Order = 2)] 
[HttpPost] 
public ActionResult Edit(DraftViewModel draft) 
{ 
    if (!ModelState.IsValid) return View(draft); 
    // do stuff 
    return RedirectToAction("Index"); 
} 

Ссылка: http://rion.io/2015/11/13/understanding-routing-precedence-in-asp-net-mvc/

+0

Я пробовал, но это не сработало. '[POST]' не работает. Когда я отправляю форму, я вижу это (https://www.screencast.com/t/5fOOF2EVt). Тем не менее, ссылки действительно выглядят красиво, но без функциональности post это не выход! – Ciwan

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