ASP.NET MVC Routing, нужна помощь в создании маршрута - PullRequest
0 голосов
/ 19 августа 2010

Мои текущие правила маршрутизации

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
    "Admin", // Route name
    "Admin/{controller}/{action}/{id}", // URL with parameters
    new { controller = "Admin", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

У меня есть несколько контроллеров, доступ к которым может получить только администратор. В настоящее время у меня есть меню по адресу:

/Admin/Index

Который перечисляет кучу ссылок действий. Прямо сейчас, щелкнув любую из этих ссылок, вы перенаправляете, как в этом примере:

/News/Index

Но мне нужно, чтобы это было похоже на

/Admin/News/Index

Эта текущая настройка вроде работает, но ссылки на моей домашней странице перехватываются неправильным правилом и собираются, например, / Admin / Article / 1, когда они должны быть просто / Article / 1

Я искал в StackOverflow ответ и нашел некоторые из них, которые подходят ближе - но я до сих пор не достаточно хорошо разбираюсь в маршрутизации, чтобы использовать их ответы. Любая помощь приветствуется.

EDIT

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

<div id="menucontainer">

                <ul id="menu">              
                    <li><%: Html.ActionLink(" ", "About", "Home", null, new { ID = "AboutMHN" })%></li>
                    <li><%: Html.ActionLink(" ", "Products", "Home", null,  new { ID = "Products" })%></li>
                    <li><%: Html.ActionLink(" ", "HubLocator", "Home", null, new { ID = "HubLocator" })%></li>
                    <li><%: Html.ActionLink(" ", "ResellerProgram", "Home", null, new { ID = "ResellerProgram" })%></li>
                    <li><%: Html.ActionLink(" ", "ResellerLogin", "Home",  null, new { ID = "ResellerLogin" })%></li>
                    <li><%: Html.ActionLink(" ", "ContactUs", "Home", null, new { ID = "ContactUs" })%></li>
                </ul>                 

            </div>

Кроме того, у моего администратора есть только действие index. У меня есть контроллеры для всех других страниц «Администратор», например, у моего NewsController есть действия для индексации, создания, редактирования, удаления, для вывода списка всех новостных статей и выполнения необработанных операций. Я неправильно это структурирую?

Мой AdminController.cs

 [Authorize(Roles = "Administrator")]
    public class AdminController : Controller
    {
        //
        // GET: /Admin/

        public ActionResult Index()
        {
            return View();
        }


    }

Admin / Index, который возвращается, содержит меню с ActionLinks, как

<li><%: Html.ActionLink("News Articles", "Index", "News") %></li>

My NewsController.cs имеет Действия для выполнения операций CRUD. Я хотел бы, чтобы URL был

Admin/News/Edit/5

вместо

News/Edit/5

Ответы [ 3 ]

0 голосов
/ 19 августа 2010

Отображение сверху вниз, будет использоваться первый маршрут, который можно применить. В вашем случае у вас есть маршрут администратора по умолчанию. Так как Default можно использовать, он будет использоваться, поэтому вы должны поместить Admin route выше Default. Проблема в том, что все будут использовать этот маршрут. Вам нужно быть более конкретным, возможно, вам следует удалить {controller}, чтобы только действия администратора использовали этот маршрут. Нужно больше информации, чтобы лучше посоветовать.

0 голосов
/ 20 августа 2010

Мне нужно было использовать Области.

См .: http://elegantcode.com/2010/03/13/asp-net-mvc-2-areas/

Я создал новую область с именем Admin, переименовал мой AdminController.cs в MenuController.cs и поместил все необходимые контроллеры и представления в папку области администратора. Внутри папки области администратора есть файл AdminAreaRegistration.cs, который содержит

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller= "Menu", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Мне пришлось добавить в controller = "Menu", чтобы при переходе к / Admin по умолчанию вы переходили в / Admin / Menu / Index. Теперь любой из моих контроллеров в папке области доступен как / Admin / News / Edit / 5 и так далее. Спасибо за ваши попытки, я должен был быть более ясным, что я абсолютный новичок MVC и не знал об Областях с самого начала.

0 голосов
/ 19 августа 2010

Переверните два:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    "Admin", // Route name
    "Admin/{controller}/{action}/{id}", // URL with parameters
    new { controller = "Admin", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

Если это не сработает, добавьте код для ссылок меню новостей на ваш вопрос.

...