【问题标题】:RedirectToAction from different controller and with parameters/routevalues not working来自不同控制器且参数/路由值不起作用的 RedirectToAction
【发布时间】:2012-08-16 02:22:27
【问题描述】:

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

这是我的代码:

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

请帮忙。

【问题讨论】:

  • 您可以发布您尝试重定向到的操作吗?

标签: asp.net-mvc redirecttoaction


【解决方案1】:

重定向时不能发送复杂对象。您必须将每个属性包含为查询字符串参数。这仅适用于简单的标量属性。

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);
    ...
}

【讨论】:

    【解决方案2】:

    希望你有

    public ActionResult Insert(TempPoliciesUpload tempPolicy)
    

    PoliciesController 类中的操作方法。

    请看RedirectToAction的重载here

    【讨论】:

      【解决方案3】:

      从您要重定向到的控制器中删除参数并删除new { tempPolicy = TempPolicy }。看看这是否有效(然后你将问题定位到参数)。

      您很可能需要将其转换为您重定向到的操作类型(因此 Mark 要求您提供该签名)或以其他方式使用它,也许加引号(我怀疑但很好尝试)

      如果这不起作用,请检查您的拼写(这就是我不喜欢魔术字符串并喜欢T4MVC 的原因)——但我怀疑命名看起来是否正确。 p>

      另一个可能的可能性是在这里为其他人解决的问题:RedirectToAction not working

      【讨论】:

        【解决方案4】:

        有没有人尝试过使用复杂对象的第一个解决方案? 我的意思是这个:

        "...和你的目标操作:..."

        公共 ActionResult 插入(TempPoliciesUpload TempPolicy) { ... }

        我认为 RouteValueDictionary 不会转换或转换为复杂对象。 (我认为必须使用序列化)

        我的解决方案是将参数作为 RouteValueDictionary 传递并在目标操作中单独接收每个参数。

        【讨论】:

          【解决方案5】:

          如果您需要发送一个复杂的对象,您可以尝试从另一个控制器返回视图,如下所示:

          public ActionResult sendPolicy(TempPoliciesUpload TempPolicy) { return View("~Views/Policies/Insert.cshtml", TempPolicy ); }

          如果您希望此视图回发到正确的控制器方法,您需要在“BeginForm”Html Helper 中指定:

          ... @using(Html.BeginForm("Insert", "Policy") { ... }

          这确实不是最佳做法,但它是一种解决方法,您可以使用它,直到您修复足够的应用程序其余部分以便您可以正确使用重定向。

          【讨论】:

            【解决方案6】:

            对于解耦,@Darin Dimitrov 的回答最适合。但是,如果您不希望在 URL 中传递详细信息,例如用户无法处理数据,您可以使用短暂的持久性 TempData 功能,如下所示:

            public ActionResult sendPolicy(TempPoliciesUpload TempPolicy)
            {
                TempData["Policy"] = TempPolicy;
                return RedirectToAction("Insert", "Policies");
            }
            

            然后在插入中检索它:

            public ActionResult Insert()
            {
                TempPoliciesUpload TempPolicy = (TempPoliciesUpload)TempData["Policy"];
            }
            

            【讨论】:

              猜你喜欢
              • 2021-12-19
              • 2020-06-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-10
              • 2016-12-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多