【问题标题】:sending a list through RedirectToRoute通过 RedirectToRoute 发送列表
【发布时间】:2012-08-06 17:07:03
【问题描述】:

我正在使用模型视图控制器结构开发 Razor 应用程序,我尝试编辑某些内容,然后使用重定向路由以返回到索引页面,但我也尝试将错误作为列表传递字符串。

我有这样的事情:

var errorMessages = new List<string>();
{...}
return RedirectToRoute("Default", new { controller = "Controller", action = "Action",  errorMessages = errorMessages });

这就是我的其他控制器方法的样子:

public ActionResult Action(List<string> errorMessages)
{
...
}

问题是无论在我的第一个控制器中发生什么,在Action 方法中,我总是得到一个包含一个元素的集合,该元素读取"System.Collections.Generic.List'1[System.String]"。而我希望收到实际的收藏。

任何想法为什么会发生这种情况?或者如何解决?

【问题讨论】:

    标签: c# asp.net-mvc razor asp.net-mvc-routing


    【解决方案1】:

    您需要使用项目列表填充RouteValueDictionary。现在,您所做的只是将errorMessages 设置为List&lt;string&gt; 类型的名称。

    为了解决这个问题,您需要手动填充RouteValueDictionary,确保您以默认模型绑定器期望的格式执行此操作。这意味着,为了绑定到一个集合,您需要向它传递一个项目列表,格式如下:

    errorMessages[0]
    errorMessages[1]
    ...
    errorMessages[n]
    

    要了解为什么需要这样做,请阅读 Phil Haack 的博客文章:Model Binding To A List。这是一个简单的示例,向您展示如何执行此操作:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var errorMessages = new List<string>() { "test", "test2" };
    
            RouteValueDictionary rvd = new RouteValueDictionary()
            {
                { "controller", "home" },
                { "action", "action" }
            };
    
            for (int i = 0; i < errorMessages.Count; i++)
                rvd["errorMessages[" + i + "]"] = errorMessages[i];
    
            return RedirectToRoute("Default", rvd);
        }
    
        public ActionResult Action(List<string> errorMessages)
        {
            // Do stuff
    
            return View();
        }
    }
    

    ActionerrorMessages 参数现在将包含 testtest2 的值。

    【讨论】:

      【解决方案2】:

      您可以使用TempData

      在行动方法中,您应该将您的消息保存到TempData

      var errorMessages = new List<string>();
      {...}
      TempData["Errors"] = errorMessages;
      return RedirectToRoute("Default", new { controller = "Controller", action = "Action" });
      

      然后您可以在 Razor 视图页面或操作中获取它

      @{
          var errorMessages = TempData["Errors"] as List<string>;
      }
      
      <ul>
      @foreach(var errorMessage in errorMessages ){
          <li>@errorMessage</li>
      }
      </ul>
      

      阅读这里http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-19
        • 1970-01-01
        • 2013-10-14
        • 2016-04-08
        • 2016-07-30
        • 1970-01-01
        • 2015-09-29
        • 1970-01-01
        相关资源
        最近更新 更多