例如,我可以执行类似
的操作吗?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
答案 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
的构造函数来处理。
希望这会有所帮助。