我在应用程序中重定向到另一个控制器和操作时遇到问题。
我的重定向操作如下:
public IActionResult Redirect(NotificationItemViewModel model)
{
NotificationItemToggleReadCommand command = new NotificationItemToggleReadCommand();
command.Id = new EntityId(model.Id);
command.MarkAsRead = true;
var result = CommandProcessor.Run(command);
RedirectResult redirectResult = new RedirectResult(model.Subject.Url,true);
return redirectResult;
}
我的model.Subject.Url例如采用以下格式:Identity/User#/Details/b868b08c-b3ba-4f45-a7b6-deb02440d42f
它是区域/控制器/动作/ id。 问题是我的RedirectResult将我重定向到:
notifications/Identity/User#/Details/b868b08c-b3ba-4f45-a7b6-deb02440d42f
并且该路由不存在(controller / area / controller / action / id) 如何强制重定向来切断第一个控制器名称?
我的路线:
app.UseMvc(routes =>
{
routes.MapRoute("areaRoute", "{area:exists}/{controller}/{action=Index}/{id?}");
routes.MapRoute(
name: "controllerActionRoute",
template: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" },
constraints: null,
dataTokens: new { NameSpace = "default" });
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
感谢您的帮助。
答案 0 :(得分:6)
如果我正确理解您的问题,那是因为您在通知区域(某些其他区域)并尝试移出该区域。
为此您可以执行以下任一操作。
请在RedirectResult中提供绝对网址,而不是提供相对网址。现在的问题是,当应用程序引导重定向时,它会考虑相对URL,这就是问题。
第二个解决方案是使用RedirectToActionResult而不是RedirectResult。
RedirectToActionResult redirectResult = new RedirectToActionResult("Details", "User", new { @area = "Identity", @Id = "b868b08c-b3ba-4f45-a7b6-deb02440d42f" });
return redirectResult;
在上面我假设区域名称是" Identity"和控制器名称是"用户"并且行动是"细节"。 Acition有一个名称为" Id"的参数。您可以根据自己的要求进行更改。在这里你不必构建绝对URL。
更新1
如果我认为你总是要做root并忽略"通知"在开始。
至少你可以像这样提供网址。
~/Identity/User#/Details/b868b08c-b3ba-4f45-a7b6-deb02440d42f