2016-04-17 1 views
1

У меня есть AdminController, который выглядит следующим образом:Url.Action не работает с маршрутами, указанными в контроллере с использованием маршрута аннотацию

AdminController [Route("admin")]

Index() (landing page for all administrative content)

UserIndex() - [Route("users")]
UserDetails() - [Route("users/details/{id}")]

RoleIndex() - [Route("roles")]
RoleDetails() - [Route("roles/details/{id}")]

Они равны следующие шаблоны URL:

администратора/пользователей
администратора/пользователей/детали/1

Однако, если я пытаюсь сделать следующее на мой взгляд, он не работает :

Url.Action("UserDetail", "Admin") 

не должно быть достаточно умным для вывода: '/ admin/users/details'?

Он работает только, если я делаю Url.Action("Index", "Admin"), так как с ним нет метки маршрута.

Update:

Я пытаюсь использовать Kendo Template Syntax с колонкой Кендо Сетка ClientTemplate:

columns.Bound(c => c.Id).ClientTemplate(
     "<a href='" + 
      Url.Action("UserDetails", "Admin") + 
      "/#= Id #'" + 
     ">Details</a>" 
    ); 

Ссылка для каждой строки заканчивается выглядеть так: «локальный: 9000/123 ' /admin/users/detail полностью игнорируется ...

А вот моя точная декларация методы я пытаюсь позвонить в AdminController:

// GET: Users/Details/5 
[Route("users/details/{id}")] 
public async Task<IActionResult> UserDetails(string id) 
{ 
} 

ответ

2

Перепроверьте маршруты и действия для контроллера

[Route("admin")] 
public class AdminController : Controller { 
    // GET admin 
    [Route("")] 
    public IActionResult Index() {...} 

    //GET admin/users 
    [Route("users")] 
    public IActionResult UserIndex() {...} 

    //GET admin/users/details/1 
    [Route("users/details/{id}")] 
    public IActionResult UserDetails(string id) {...} 

    //GET admin/roles 
    [Route("roles")] 
    public IActionResult RoleIndex() {...} 

    //GET admin/roles/details/1 
    [Route("roles/details/{id}")] 
    public IActionResult RoleDetails(string id) {...} 

} 

не это должны быть достаточно умными, чтобы output: '/ admin/users/details'?

согласно вашим маршрутам установка /admin/users/details не существует.

Ожидание запроса к /admin/users/details/{id}, где {id} - userid. Поэтому, когда запрашивается Url.Action("UserDetail", "Admin"), ничего не подойдет.

Url.Action("UserDetail", "Admin", new { id = "1" }) 

Вы можете сделать id необязательный параметр, обновляя маршрут

[Route("users/details/{id?}")] 

Это позволит users/details работать.но значение параметра id по умолчанию будет null.

Это работает только если я Url.Action("Index", "Admin"), так как нет ни одного маршрута тегов с ним

Он работает только с Url.Action("Index", "Admin"), поскольку Конвенция соответствует индексу по умолчанию.

+0

hmm Я верю, что вы что-то здесь. Вы можете увидеть обновление в нижней части моего сообщения? –

+0

Я не знаком с этой структурой – Nkosi

+0

Просто знайте, что # = Id # является заполнителем для Id строки в сетке. Я просто понял, что моя проблема была основана на вашем ответе. Дайте мне знать, если вы скажете мне, почему. Это работает: Url.Action («UserDetails», «Admin», new {id = "# = Id #"}) + "'" + "> Подробности", и ЭТО НЕ: Url.Action ("UserDetails", " «Admin») + «/ # = Id # '» –

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