我真的不知道应该使用什么标题来描述我的问题。为了简化我的问题。这是我的测试。我从头开始创建一个mvc3站点。然后我添加名为“admin”的区域。在管理员内部,我有一个名为“搜索”的控制器,并且已经装饰了“授权”属性。然后我更改了我的Global.ascx.cs路由设置以附加我的控制器命名空间。现在我开始测试了。
问题1
当我访问http://localhost:xxx/Search页面时,它会将我重定向回/ Account / Logon页面,这让我先混淆,为什么会将我重定向到登录页面?根据我的理解,它根本不应该达到管理员搜索控制器。如果我删除了Authorize属性,它会显示黄色屏幕,表示找不到我预期的视图。
问题2
如果我添加带角色的Authorize属性,例如(Roles =“Admin”),然后我再次尝试访问Search页面,无论登录成功与否,我总是会重定向回登录页面。为什么它不给我黄色屏幕,因为我试图在主站点请求搜索控制器索引视图而不是管理区域的一个。很困惑。
我是MVC开发的新手,有人可以给我一个关于我的问题的解决方案吗?
由于
Global.ascx.cs
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[]{"TestAreaRouting.Controllers"}
);
}
答案 0 :(得分:1)
通过将RegisterRoutes
数据标记设置为Global.asax
,您可以将默认控制器工厂限制为仅在UseNamespaceFallback
false
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "TestAreaRouting.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;
}
方法中为控制器指定的命名空间内查找:
/search
如果您在请求admin
时未执行此操作,则Admin
区域路由不匹配,因为该网址不以SearchController
前缀开头。
所以它是匹配的默认路由。默认控制器工厂开始扫描程序集以查找从Controller
派生的名为~/Views/Search/Index.cshtml
的类,并且因为它找到一个它实例化它并使用它来提供请求。显然它没有找到相应的索引视图,因为它在{{1}}中看起来显然不存在。实际视图位于该区域。
既然我们已将控制器限制在各自的位置,您可以使用Authorize属性修饰它们,并且它应该表现一致。