首先,我看到了这个问题: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。
我如何才能完成操作并仍保留域名的根网址?
答案 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这可能仍需要更多配置。希望的想法有帮助