1

例如,我可以有这样的动作,

public class HandleMessageController : Controller
{
    public ActionResult ShowMessage(HandleMessage message)
    {
        return View(message);
    }
}

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

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

我对其进行了测试,并且动作 ShowMessage 总是得到 null 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

4 回答 4

1

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

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

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

public class HandleMessage
{
     public HandleMessage()
     {
     }
}

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

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

编辑:

对此进行更多研究,似乎对于更复杂的对象,路由值并不是存储它的最佳方式。

我阅读了这个链接,它表明这通常是通过使用 TempData 字典来处理的。将它存储在这里只会持续请求,但允许您移动这些复杂的对象。

最后,我能够在不使用 TempData 的情况下让它工作,就像你做的那样,但是在传入的操作中,我没有将绑定指定为 HandleMessage,而是一个签名:

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

}
于 2013-06-24T04:32:49.783 回答
1

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

于 2013-06-24T04:20:50.587 回答
1

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

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

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

并在重定向动作中

HandleMessage message = (HandleMessage)TempData["some_unique_name"];
于 2013-06-24T05:38:42.117 回答
0

我认为message操作中的变量名会影响DefaultModelBinder操作。现在有两个带有 name 的候选属性message,一个在 action 方法参数中,一个在HandleMessageclass 中。似乎DefaultModelBinder是在试图捕捉Message=The%20message价值并试图把它变成一个HandleMessage实例。您可以将变量重命名为messagelikemsg或 so 以外的其他名称,它应该可以工作。

PSHandleMessage该类应该有一个参数较少的构造函数DefaultModelBinder来处理。

希望这可以帮助。

于 2013-06-24T05:41:45.960 回答