来自不同控制器的RedirectToAction以及参数/路由值不起作用

时间:2012-08-16 02:22:28

标签: asp.net-mvc redirecttoaction

我正在尝试从不同的控制器调用一个动作方法但它不起作用。它只是跳过RedirectToAction

这是我的代码:

public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
        {
            return RedirectToAction("Insert", "Policies", new { tempPolicy = TempPolicy });
        }

请帮忙。

6 个答案:

答案 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"];
}