2011-07-30 59 views
0

首先,我看到了这个问题:ASP.NET MVC one route, two different views但它并不回答我的确切问题。如何在ASP.NET MVC中使用相同的路径创建两个视图?

我想有一个图,但具体取决于您是否已经登录同一网址/路由

我想它,所以如果一个用户进入: mydomain.com那么他们要么是带到营销登陆页面,或者他们将被带到用户登录的仪表板。

我上面贴的问题表明,我应该使用:

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

然而,我的观点一个要求,我通过他们的特定动作,因为它需要的行动提供视图模型数据。

现在,如果我这样做:

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

这工作,但重定向会导致用户的网址是仪表板指数作用,这是mydomain.com/dashboard的路线。

我怎样才能通过操作并仍然保持我的域的根网址?

回答

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"); 
} 
+0

然后我有代码重复。这些是在两个不同的控制器(“仪表板”vs“着陆”)和仪表板控制器有很多的存储库,没有真正有意义的着陆控制器。 –

+0

我可能是错的,但这是唯一可以考虑维护url并仍然检索模型的方法。另一种(未经测试)的方式可能会在“仪表板”视图中的代码块中进行模型检索,但我不建议这样做,因为您“应该”保持视图精简。 –

+0

为什么你不能建立一个完成所有繁重工作的服务,然后在'LandingPage'动作和'Dashboard'动作中使用该服务? –

0

我知道这是不是你想要的是什么,但它导致仪表盘正对域的根和登录重定向到改为另一个网址。而当你认为你可能会想在把它这种功能对于每一个“授权”页面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(); 
    } 
0

这是我认为可以帮助你的快速构思。 我还没有深入测试过

情况看起来类似于具有相同的动作,并使用[HttpGet]或[HttpPost]动作方法选择器属性对它们进行装饰。如果与帖子相匹配,则优先执行帖子后的操作,否则获得。 我将适用同样的逻辑,使用自定义路由约束

首先创建约束类

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这可能仍然需要更多配置。希望的想法有帮助

相关问题