【问题标题】:Pass an instance of class to an action in another controller?将类的实例传递给另一个控制器中的动作?
【发布时间】:2013-06-24 13:41:45
【问题描述】:

例如,我可以有一个类似的动作,

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我应该使用字符串连接来生成 URL 吗?我认为 Asp.Net MVC 会自动将实例转换为查询字符串。如何从路由中获取操作和控制器?谢谢。
    • 嗯,它适用于您的对象实例我忘记了路由数据可以用匿名对象填充,所以为什么不能使用具体类型?现在你必须提供一个无参数的构造函数,它现在应该可以工作了。
    【解决方案2】:

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

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

    【讨论】:

    • 刚刚添加了一个默认的空构造函数,还是不行。
    • new { message = new HandelMessage(... 会生成一个...?message=NameSpace.HandleMessage的url
    【解决方案3】:

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

    但是这里有解决方法。你可以使用TempData

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

    在重定向动作中

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

    【讨论】:

      【解决方案4】:

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

      附: HandleMessage 类应该有一个无参数构造函数供 DefaultModelBinder 使用。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-25
        • 2018-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        相关资源
        最近更新 更多