【问题标题】:RedirectToAction to another Controller and passing parametersRedirectToAction 到另一个控制器并传递参数
【发布时间】:2015-06-10 11:47:11
【问题描述】:

我是 C# 新手,尤其是 ASP.NET MVC。

我有我的 HomeController,其中包含这个方法:

public ActionResult Error(Error error)
{
    return View(error);
}

现在我有另一个控制器,里面有以下行:

return RedirectToAction("Error","Home", new { Error = (new Error("ErrorName","ErrorDescription"))} );

您可能会注意到,我正在尝试将一个错误对象传递给另一个控制器,然后它应该将它传递给视图。

Error 类是我自己写的,没什么特别的:

public class Error
{
    public String name {  get; private set; }
    public String description {  get; private set; }
    public int number {  get; private set; }

    public Error(String name, String description)
    {
        this.name = name;
        this.description = description;
        number = 0;
    }
}

我的问题是每次我尝试访问 HomeController 中的错误变量时,它都是null。 我已经用谷歌搜索了一些帖子,但我不明白,为什么我的代码不起作用。 没有错误,只是这个空值对象.. 我感谢任何帮助! :)

【问题讨论】:

  • 因为您的所有属性都有private setDefaultModelBinder 无法设置属性。而且您还需要包含一个无参数构造函数
  • 你确定你可以通过serialized object

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


【解决方案1】:

DefaultModelBinder 无法根据查询字符串参数初始化实例或 Error 类,因为您的所有属性都有 private set

你的模型应该是

public class Error
{
  public String name {  get; set; }
  public String description {  get; set; }
  public int number {  get; set; }

  public Error() // you must add a parameter-less constructor
  {
  }

  public Error(String name, String description)
  {
    this.name = name;
    this.description = description;
    // number = 0; // no need for this - the default is 0
  }
}

你也可以使用

return RedirectToAction("Error","Home", new { name = "ErrorName", description = "ErrorDescription"});

并删除两个构造函数

【讨论】:

  • 感谢您的回答!我删除了private 语句并添加了一个无参数构造函数,但是当我尝试访问HomeControllers Error(Error error) 方法中的参数时,我仍然得到一个异常。我trird String test = error.name;...您还有其他想法吗?谢谢,直到这里:)
  • A NullReferenceException 被抛出,因为error 变量是null
  • 我刚刚对此进行了测试,它工作正常。你试过RedirectToAction() 根据我上次的sn-p
  • 是的,它有效 - 谢谢!但我现在不太明白,编译器是如何知道他必须创建一个错误对象的——你知道我的意思吗?我刚刚发现写new Error {name="...",description="..."}时没有效果
  • 当您执行RedirectToAction() 时,您实际上并未将模型传递给Error() 方法。 RedirectToAction() 在内部生成查询字符串值(您的 url 将是 /Home/Error?name=ErrorName&description=ErrorDescription)。然后在Error() 方法中,DefaultModelBinder 首先初始化方法参数(即您的Error 类)-这就是您需要无参数构造函数的原因,然后它设置属性-这就是您需要公共设置器的原因.
【解决方案2】:

在命名匿名参数时,尝试使用小写的“error”。

return RedirectToAction("Error","Home", new { error = (new Error("ErrorName","ErrorDescription"))} );

我相信参数是按名称传递的,现在他无法将“错误”链接到您的方法的参数名称。

【讨论】:

  • Te DefaultModelBinder 不区分大小写 - 这完全没有区别
【解决方案3】:

您不能在这样的 url 中传递复杂的对象。您必须发送其组成部分:

public ActionResult YourAction()
{

   // Here user object with updated data

   return RedirectToAction("Error","Home", new { 
        name = "ErrorName", 
        description = "ErrorDescription", 
        number = 0
   });
}

【讨论】:

  • 当然你可以传递复杂的对象(只要它们的属性是值类型——OP就是)
  • 这很好用 - 谢谢!但是现在我不明白编译器是如何知道他必须创建一个 Error 对象的——他是否“查看”了 HomeControllers 方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多