我正在尝试从不同的控制器调用一个动作方法但它不起作用。它只是跳过RedirectToAction
这是我的代码:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
return RedirectToAction("Insert", "Policies", new { tempPolicy = TempPolicy });
}
请帮忙。
答案 0 :(得分:10)
重定向时无法发送复杂对象。您必须将每个属性包含为查询字符串参数。这只适用于简单的标量属性。
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
return RedirectToAction("Insert", "Policies", new
{
id = TempPolicy.Id,
prop1 = TempPolicy.Prop1,
prop2 = TempPolicy.Prop2,
...
});
}
如果您有复杂属性,则必须包含它们,以便默认模型绑定器能够从查询字符串参数绑定目标操作中的模型:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
return RedirectToAction("Insert", "Policies", new RouteValueDictionary
{
{ "id", TempPolicy.Id },
{ "prop1", TempPolicy.Prop1 },
{ "prop2", TempPolicy.Prop2 },
{ "prop3.subprop1", TempPolicy.Prop3.SubProp1 },
{ "prop3.subprop2", TempPolicy.Prop3.SubProp2 },
...
});
}
和你的目标行动:
public ActionResult Insert(TempPoliciesUpload TempPolicy)
{
...
}
另一种可能性是在重定向之前将此对象保留在后端,然后仅传递id:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
int id = Repository.Save(TempPolicy);
return RedirectToAction("Insert", "Policies", new { id = id });
}
并在你的目标行动中:
public ActionResult Insert(int id)
{
TempPoliciesUpload TempPolicy = Repository.Get(id);
...
}
答案 1 :(得分:0)
从您要重定向到的控制器中删除参数,然后删除new { tempPolicy = TempPolicy }
。看看是否有效(然后将问题本地化为参数)。
你最有可能需要将它转换为你重定向的动作类型(因此马克要求你签名)或者用它来玩,否则可能会加上引号(我怀疑但很好尝试)
如果即使这样也行不通,请检查你的拼写(这就是为什么我不喜欢魔术字符串并且喜欢T4MVC) - 但我也怀疑这一点,命名看起来是正确的。
另一个可能的可能性是在这里为其他人解决的问题:RedirectToAction not working
答案 2 :(得分:0)
我希望你有
public ActionResult Insert(TempPoliciesUpload tempPolicy)
在PolicyController类中的动作方法。
请参阅RedirectToAction here
的重载答案 3 :(得分:0)
有没有人尝试过复杂对象的第一个解决方案? 我是说这个:
“......和你的目标行动:......”
public ActionResult Insert(TempPoliciesUpload TempPolicy) { ... }
我认为RouteValueDictionary不会转换或转换为复杂对象。 (我认为必须使用序列化)
我的解决方案是将参数作为RouteValueDictionary传递,并在目标操作中单独接收每个参数。
答案 4 :(得分:0)
如果您需要发送一个复杂的对象,您可以尝试从另一个控制器返回视图,如下所示:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
return View("~Views/Policies/Insert.cshtml", TempPolicy );
}
如果您希望此视图回发到正确的控制器方法,则需要在' BeginForm'中指定。 Html助手:
...
@using(Html.BeginForm("Insert", "Policy")
{
...
}
这不是最佳做法,但这是一种可以使用的解决方法,直到您修复了应用程序的其余部分,以便您可以正确使用重定向。
答案 5 :(得分:0)
对于脱钩,@ Darin Dimitrov的答案最适合。但是,如果您不希望在URL中传递详细信息,以便例如用户无法摆弄数据,则可以使用短暂的持久性TempData功能,如下所示:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
TempData["Policy"] = TempPolicy;
return RedirectToAction("Insert", "Policies");
}
然后在Insert:
中检索它public ActionResult Insert()
{
TempPoliciesUpload TempPolicy = (TempPoliciesUpload)TempData["Policy"];
}