如何在ASP.NET MVC中使用相同的路径获得两个视图?

时间:2011-07-30 00:44:20

标签: asp.net-mvc routing

首先,我看到了这个问题:ASP.NET MVC one route, two different views但它没有回答我的确切问题。

我希望拥有一个视图,但具有相同的网址/路由,具体取决于您是否已登录。

如果用户访问我,我希望如此: mydomain.com然后他们将被带到营销登陆页面,或者他们将被带到用户登录的仪表板。

我上面发布的问题表明我应该使用:

if (Request.IsAuthenticated) {
    return View("Dashboard");
} else {
    return View("Index");
}

但是,我的一个观点要求我完成他们的特定操作,因为它需要操作提供的视图模型数据。

现在,如果我这样做:

if (Request.IsAuthenticated) {
    return RedirectToAction("Index", "Dashboard");
} else {
    return View("Index");
}

这样可行,但重定向将导致用户的url成为仪表板索引操作的路径,即mydomain.com/dashboard。

我如何才能完成操作并仍保留域名的根网址?

3 个答案:

答案 0 :(得分:0)

您需要在当前操作中填充模型数据

if (Request.IsAuthenticated) {
    // populate your model to send it to the Dashboard.
    // to keep it DRY, you'll want to use a data service.
    var model = DataService.GetData();
    return View("Dashboard", model);
} else {
    return View("Index");
}

答案 1 :(得分:0)

我知道这不是您想要的,但它会导致Dashboard位于域的根目录并登录重定向到其他URL。当你考虑到你可能希望每个“授权”页面都有这个功能时,将它放在if语句中看起来是一种痛苦的方式:

在web.config中

<authentication mode="Forms">
  <forms loginUrl="~/Login" timeout="15" slidingExpiration="true" />
</authentication>

然后装饰控制器:

    [Authorize]
    public ActionResult Index()
    {
       return View();
    }


    [Authorize(Roles="SysAdmin")]
    public ActionResult ManageUsers()
    {
       return View();
    }

答案 2 :(得分:0)

这是我认为可以帮助你的快速想法。 我没有对此进行深入测试

情境类似于具有相同的操作,并使用[HttpGet]或[HttpPost]操作方法选择器属性进行装饰。如果与post匹配,则优先执行并执行post下的操作,否则获取。 我将使用相同的逻辑使用自定义路由约束

首先创建约束类

public class IsAuthenticatedRouteConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            return httpContext.Request.IsAuthenticated;
        }
    }

然后,在global.asax中,注册两个路由。第一个是更高优先级并具有经过身份验证的约束,因此在用户登录时匹配。否则第二个。通过提供正确的默认值,我认为您可以获得所需的结果。

routes.MapRoute(
                "DefaultAuthenticated", 
                "{controller}/{action}/{id}",
                new { controller = "Default", action = "Dashboard", id = UrlParameter.Optional },
                new { isAuthenticated = new IsAuthenticatedRouteConstraint()}
            );

            routes.MapRoute(
                "Default", //Matches if not authenticated
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Default", action = "Index", id = UrlParameter.Optional }
            );

P.S这可能仍需要更多配置。希望的想法有帮助