14

MVC エリアを使用しているプロジェクトがあります。エリアにはプロジェクト全体が含まれていますが、エリアの外側のメインの「Views/Controllers/Models」フォルダーは空で、デフォルトの受信リクエストを自分のエリアのホームコントローラーにルーティングするように設定したディスパッチコントローラーがありません。

このコントローラーには、次のような 1 つのメソッドがあります。

public ActionResult Index(string id)
    {
        return RedirectToAction("Index", "Home", new {area = "xyz"});
    }   

次のように、このコントローラーを使用するためのデフォルトルート設定もあります:-

routes.MapRoute(
            "Default",                                              // Default route
            "{controller}/{action}/{id}",
            new { controller = "Dispatch", action = "Index", id = UrlParameter.Optional }
        );   

私のサイトへのデフォルトのリクエストは、関連するエリアに適切にルーティングされます。Area の "RegisterArea" メソッドには単一のルートがあります:-

context.MapRoute(
            "xyz_default",
            "xyz/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }

私のエリアには、多くのビューを持つ複数のコントローラーがあります。"return View("blah"); のようなこれらのコントローラー メソッドで特定のビューを呼び出すと、正しいビューがレンダリングされます。ただし、パラメーターとして渡されたモデル オブジェクトと共にビューを返そうとすると、次のエラーが発生します。

Server Error in '/DeveloperPortal' Application.
The view 'blah' or its master was not found. The following locations were searched:
~/Views/Profile/blah.aspx
~/Views/Profile/blah.ascx
~/Views/Shared/blah.aspx
~/Views/Shared/blah.ascx 

モデルオブジェクトがパラメータとして渡されるときのように見えます。「View()」メソッド [eg return View("blah",obj) ] に対して、領域固有のビュー フォルダーではなく、プロジェクトのルートでビューを検索します。

ここで何が欠けていますか?

前もって感謝します。

4

8 に答える 8

8

解決しました!私の "RedirectToAction" 呼び出しのいくつかは、そのメソッドの routeobject コレクション パラメーターでエリア名を明示的に指定していませんでした。奇妙なことに、リダイレクトするコントローラーがすべて同じエリアにあるにもかかわらず、それが必要です。また、routeobject コレクションで新しい {area="blah"} を指定しない場合、HtmlActionLinks は正常に機能するため、コントローラー アクションの呼び出しと呼び出しの両方で RedirectToAction() を呼び出す必要があるのはなぜだろうかすべて同じエリア内にあります。

于 2010-04-13T20:14:57.647 に答える
7

代わりに使用する場合

context.MapRoute(
        "xyz_default",
        "xyz/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }

使用する

context.MapRoute(
        "xyz_default",
        "{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }

あなたの

xyzAreaRegistration.cs

次に、リンクで地域を明示的に指定する必要はありません...

于 2013-11-18T08:54:01.550 に答える
4

これがルーティングの問題である場合は、最初にエリア ルートを登録することで解決できます。これにより、ルーティング エンジンは、ルート ルートを照合する前に、エリア ルートの 1 つを照合しようとします。

AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);

エリア アプリケーションでビュー フォルダーの名前を変更してエラーを強制すると、あなたとは異なるエラーが発生します。

ビュー 'インデックス' またはそのマスターが見つかりませんでした。以下の場所
  検索された:

~/Areas/xyz/Views/Document/Index.aspx
~/Areas/xyz/Views/Document/Index.ascx
〜/エリア/xyz/ビュー/共有/Index.aspx
~/エリア/xyz/ビュー/共有/Index.ascx

...そして、通常のルート ビュー フォルダ..

..これは、ある領域にあると判断した場合に検索するサブディレクトリのパターンです。

于 2010-04-12T20:44:01.300 に答える
2

MyArea AreaRegistration.csで生成されたコードを確認し、コントローラー パラメーターが既定のコントローラーに設定されていることを確認します。そうしないと、何らかの理由でコントローラーがボットと呼ばれ、ASP.NET MVC はエリア フォルダーでビューを検索しません。

public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "SomeArea_default",
            "SomeArea/{controller}/{action}/{id}",
            new { controller = "SomeController", action = "Index", id = UrlParameter.Optional }
        );
    }
于 2010-06-06T20:07:30.613 に答える
1

私はちょうど同じ問題を抱えていて、ascx の 'Build Action' プロパティを 'Embedded Resource' に設定することで解決しました。

于 2010-12-10T14:19:42.347 に答える
1

このコードを試してください。エリア登録ファイルを変更します...

context.MapRoute(
    "YourRouteName",   // Route name //
    "MyAreaName/MyController/{action}",   // URL with parameters //
    new { 
        controller = "MyControllerName", 
        action = "MyActionName", meetId =  UrlParameter.Optional
     },   // Parameter defaults
    new[] { "Your Namespace name" }
);
于 2012-06-29T10:35:00.277 に答える