0

私は一日中混乱していました。エリア内のルーティングがあり、このように見えます。

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

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRouteLowercase(null, "Account/{action}",
                                  new {controller = "Account"},
                                  new {action = @"LogOff|LogOn|Create|Update|Delete|List"},
                                  new[] {"WebUI.Areas.Admin.Controllers"});

        context.MapRouteLowercase( //this works
            "AdminUpdateCategoryView",
            "admin/{controller}/{action}/{cid}",
            new {area = "admin", controller = "Main", action = "UpdateCategory", cid = ""},
            new {cid = @"\d+"},
            new[] {"WebUI.Areas.Admin.Controllers"}
        );

        context.MapRouteLowercase(//this not works
            "AdminCategoryListView",
            "admin/Main/{action}/{page}",
            new { action = "Category", page = "1" },
            new {page = @"\d+"},
            new[] {"WebUI.Areas.Admin.Controllers"}
        );

        context.MapRouteLowercase(
            "Admin_Default", // Route name
            "admin/{controller}/{action}/{id}", // URL with parameters
            new {controller = "Category", action = "Index", id = UrlParameter.Optional} // Parameter defaults
        );
    }
}

うまくいくものとうまくいかないものを書きましたが、うまくいくものとうまくいかないものを変えると、うまくいくものとうまくいかないものがありますか?

例:

first case-> /admin/main/updatecategory/1 --> works 
             /admin/main/category/1       --> not works
             result: /admin/main/category/1?page=1

second case-> /admin/main/category/1 --> works
              /admin/main/updatecategory/1 --> not works
              result: /admin/main/updatecategory/1?cid=1

これが私のコントローラーアクションです:

public ActionResult Category(int? page)
    {
        int pageIndex = page.HasValue ? page.Value : 1;
        return View("Category", CategoryViewModelFactory(pageIndex));
    }

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

    public ActionResult UpdateCategory(int cid)
    {
        return View();
    }

    public ActionResult DeleteCategory(int? cid)
    {
        return View();
    }

この問題は何ですか?また、それを解決する方法は何ですか?

私は完全に混乱しています。ASP.MVC3 のルーティングは e-logical です。

ヘルプ?!

4

1 に答える 1

2

ルートが検索されると、URL に一致する最初のルートが使用されます。AdminUpdateCategoryView任意の管理コントローラーとアクションに一致します。"" のデフォルトの cid を指定しますが、cid がそれよりも小さい数値である必要があるため、それは問題ではありません。AdminCategoryListViewmain に入る任意の URL と一致します。デフォルトのページ 1 を指定しているため、ページが指定されていなくても問題ありません。

したがって、AdminCategoryListView上にある場合: admin/main のすべてのルートがこのルートを使用します。AdminUpdateCategoryViewこのルートに到達し、数値の cid 値パラメーターを持つ管理者のすべてのルートが最上位にある場合、それが使用されます。

AdminCategoryListViewより具体的なルートなので、上に置くことをお勧めします。削除するかpage="1"(デフォルトを提供するかどうかによって異なります)、{action}「カテゴリ」に置き換えて、他のルートがこのルートを使用しないようにします。また、main のデフォルト コントローラを提供する必要があります。そうしないと、現在使用しているコントローラが正しいものであると見なされます。

context.MapRouteLowercase(
        "AdminCategoryListView",
        "admin/Main/category/{page}",
        new { action = "Category", controller = "Main" },
        new {page = @"\d+"},
        new[] {"WebUI.Areas.Admin.Controllers"}
    );

//Put AdminUpdateCategoryView here
于 2012-05-12T02:25:41.923 に答える