将类的实例传递给另一个控制器中的操作?

时间:2013-06-24 04:13:29

标签: asp.net asp.net-mvc asp.net-mvc-4

例如,我可以执行类似

的操作吗?
public class HandleMessageController : Controller
{
    public ActionResult ShowMessage(HandleMessage message)
    {
        return View(message);
    }
}

并在另一个控制器的另一个动作中,

RedirectToAction("ShowMessage", "HandleMessage", new HandleMessage(.....));

我测试了它,动作ShowMessage总是为空message

模型HandleMessage

public class HandleMessage
{

    public HandleMessage(string message, string controllerName, string actionName, bool isError)
    {
        ActionName = actionName;
        ControllerName = controllerName;
        Message = message;
        IsError = isError;
    }
.....

更新 RedirectToAction之后的网址

http://localhost:61666/HandleMessage/ShowMessage?ActionName=XXXX&ControllerName=XXXX&Message=The%20message&IsError=False

4 个答案:

答案 0 :(得分:1)

它应该工作,但不是你尝试使用的方式。您无法在重定向到操作或任何其他“链接生成”方法中传递HandleMessage的实例。你必须为它设置一个correctroute(使用正确的模式元素名称 - 属性映射)或创建一个类似的链接?Message = error& IsError = True(就像POST请求中的wy一样,但现在每个参数都应该在查询字符串中[如果将相关属性重命名为Action和Controller,则操作和控制器将来自路由])。

答案 1 :(得分:1)

查看您的问题,看起来您的模型/类没有空构造函数。

默认的.NET模型绑定器需要一个默认构造函数来初始化类,然后设置类的公共属性。

尝试将此代码添加到您的课程中:

public class HandleMessage
{
     public HandleMessage()
     {
     }
}

此外,如果这仍然不起作用,您是否尝试过以下方式执行重定向方法:

RedirectToAction("ShowMessage", "HandleMessage", new { message =  new HandleMessage(.....) });

编辑:

再看一下,似乎对于更复杂的对象,路由值并不是存储它的最佳方式。

我读过this link并且它表明这通常是通过使用TempData字典来处理的。将它存储在此处只会持续请求,但允许您移动这些复杂对象。

最后,我能够在不使用TempData的情况下使其工作,完全按照您的方式进行操作,但是在传入操作中我没有将绑定指定为HandleMessage,而是签名:

public ActionResult ShowMessage(string Message, string ControllerName, string ActionName, bool IsError)
{

}

答案 2 :(得分:1)

我认为您不能将类传递给重定向的操作。重定向是通过生成url来完成的,因此它不能包含类。

然而,这是解决方法。您可以使用TempData

TempData["some_unique_name"] = new HandleMessage();
RedirectToAction("ShowMessage", "HandleMessage");

并在重定向操作中

HandleMessage message = (HandleMessage)TempData["some_unique_name"];

答案 3 :(得分:0)

我认为操作中的变量名message正在弄乱DefaultModelBinder操作。现在有两个名为message的候选属性,一个位于action方法参数中,另一个位于HandleMessage类中。似乎DefaultModelBinder正在尝试捕获Message=The%20message值并尝试将其转换为HandleMessage实例。您可以将message以外的变量重命名为msg左右,并且它应该可以正常工作。

P.S。 HandleMessage类应该有一个参数less DefaultModelBinder的构造函数来处理。

希望这会有所帮助。