Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 将类的实例传递给另一个控制器中的操作?_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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

Asp.net 将类的实例传递给另一个控制器中的操作?,asp.net,asp.net-mvc,asp.net-mvc-4,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(..

例如,我能做一个像

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
之后的Url为

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

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

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

默认的.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)
{

}

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

不过,这里有一个变通方法。您可以使用

在重定向操作中

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

我认为操作中的变量名
message
干扰了
DefaultModelBinder
操作。现在有两个名为
message
的候选属性,一个在action方法参数中,一个在
HandleMessage
类中。似乎
DefaultModelBinder
正试图捕获
Message=%20message
值,并尝试将其转换为
HandleMessage
实例。您可以将变量重命名为
Message
以外的其他名称,如
msg
或其他名称,该变量应能正常工作

另外,
HandleMessage
类应该有一个无参数的构造函数供
DefaultModelBinder
使用


希望这有帮助。

我应该使用字符串连接来生成Url吗?我以为Asp.Net MVC会自动将实例转换为查询字符串。我如何从路由中获取操作和控制器?谢谢。嗯,它与您的对象实例一起工作。我忘了路由数据可以用匿名对象填充,所以为什么不能使用concrete类型?现在您必须提供一个无参数构造函数,它现在应该可以工作了。只添加了一个默认的空构造函数,它仍然不能工作。
new{message=new HandleMessage(…
将生成一个url
…?message=NameSpace.HandleMessage
HandleMessage message = (HandleMessage)TempData["some_unique_name"];