我正在尝试从不同的控制器调用操作方法,但它不起作用。它只是跳过 RedirectToAction
这是我的代码:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
return RedirectToAction("Insert", "Policies", new { tempPolicy = TempPolicy });
}
请帮忙。
我正在尝试从不同的控制器调用操作方法,但它不起作用。它只是跳过 RedirectToAction
这是我的代码:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
return RedirectToAction("Insert", "Policies", new { tempPolicy = TempPolicy });
}
请帮忙。
重定向时不能发送复杂对象。您必须将每个属性包含为查询字符串参数。这仅适用于简单的标量属性。
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);
...
}
有没有人尝试过使用复杂对象的第一个解决方案?我的意思是这个:
“……和你的目标行动:……”
公共 ActionResult 插入(TempPoliciesUpload TempPolicy){ ... }
我认为 RouteValueDictionary 不会转换或转换为复杂对象。(我认为必须使用序列化)
我的解决方案是将参数作为 RouteValueDictionary 传递,并在目标操作中单独接收每个参数。
我希望你有
public ActionResult Insert(TempPoliciesUpload tempPolicy)
PoliciesController 类中的操作方法。
从您要重定向到的控制器中删除参数并删除new { tempPolicy = TempPolicy }
. 看看这是否有效(然后您将问题本地化为参数)。
很可能您需要将其转换为您重定向到的操作类型(因此马克要求您提供该签名)或以其他方式使用它,可能会加上引号(我怀疑但很好尝试)
如果即使这样也不起作用,请检查您的拼写(这就是我不喜欢魔术字符串并喜欢T4MVC的原因) - 但我怀疑命名看起来是否正确。
另一种可能的可能性是在这里为其他人解决的问题:RedirectToAction not working
如果您需要发送一个复杂的对象,您可以尝试从另一个控制器返回视图,如下所示:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
return View("~Views/Policies/Insert.cshtml", TempPolicy );
}
如果您希望此视图回发到正确的控制器方法,则需要在“BeginForm”Html Helper 中指定:
...
@using(Html.BeginForm("Insert", "Policy")
{
...
}
这确实不是最佳实践,但它是一种解决方法,您可以使用它,直到您修复了足够的应用程序其余部分,以便您可以正确使用重定向。
对于解耦,@Darin Dimitrov 的回答最适合。但是,如果您不希望在 URL 中传递详细信息,例如用户无法处理数据,您可以使用短暂的持久性 TempData 功能,如下所示:
public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
{
TempData["Policy"] = TempPolicy;
return RedirectToAction("Insert", "Policies");
}
然后在插入中检索它:
public ActionResult Insert()
{
TempPoliciesUpload TempPolicy = (TempPoliciesUpload)TempData["Policy"];
}