【发布时间】:2018-01-20 13:02:42
【问题描述】:
在我的项目中,我必须从一个控制器重定向到另一个控制器,该控制器位于名为 SIP 的区域内。如果使用以下方法重定向成功,并且 TempData 值也被传递给另一个控制器:
TempData["sipModel"] = 1;
return RedirectToAction("Index", "Home", new { area = "SIP" });
但在这种情况下,URL 发生了变化,而我的要求是保持相同的 URL,为了实现这一点,我通过了其他答案并使用了提到的 TransferToAction() 方法
in this answer 这完美地工作,我可以重定向到另一个区域,而无需使用以下代码更改 URL:
TempData["sipModel"] = 1;
return this.TransferToAction("Index", "Home", new { area = "SIP"});
但是,在这种情况下,不会保留 TempData 值,并且在尝试读取相同的值时出现空引用异常。
我尝试使用另一个答案中提到的以下代码:
public static TransferToRouteResult TransferToAction(this System.Web.Mvc.Controller controller, string actionName, string controllerName, object routeValues)
{
controller.TempData.Keep();
controller.TempData.Save(controller.ControllerContext, controller.TempDataProvider);
return new TransferToRouteResult(controller.Request.RequestContext, actionName, controllerName, routeValues);
}
但这行不通。有人可以建议我如何解决这个问题或任何其他更好的方法来实现这个结果。谢谢。
已编辑:
网址是这样的:
我在一个类中有一个复杂的数据,它也需要从一个控制器传递到另一个控制器(存在于区域 SIP 中),因为我一直在使用 TempData,我在这里使用了一个整数只是作为一个样本。
在第一个控制器方法中,我有 if-else 条件,所以:
if (companyCode = 'X')
return View();
else
TempData["sipModel"] = 1;
return RedirectToAction("Index", "Home", new { area = "SIP" }); OR (this.TransferToAction("Index", "Home", new { area = "SIP"});)
【问题讨论】:
-
在 MVC 中不需要从一个控制器“转移”到另一个控制器。您可以简单地 customize routing 将请求路由到正确的控制器,具体取决于其中的内容(考虑查询字符串值、表单发布值、cookie 或其他)。
-
@NightOwl888 感谢您的评论,您能否举例说明如何在我的情况下使用自定义路由。
-
从您的问题中不清楚您正在“转移”的条目 URL 是什么,以及您需要将
sipModel设置为 1 或 2 的条件。您能提供更多上下文吗?这个确定是由查询字符串参数做出的吗?一块饼干?表单后值?请求中还有其他内容吗? -
@NightOwl888 我添加了更多信息,请查看。谢谢。
标签: c# asp.net asp.net-mvc asp.net-mvc-5 tempdata