通过RedirectToRoute发送列表

时间:2012-08-09 12:58:38

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

我正在使用模型视图控制器结构的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]"。而我期待收到实际的收藏品。

为什么会这样?或者如何解决?

2 个答案:

答案 0 :(得分:3)

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

为了解决这个问题,您需要手动填充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();
    }
}

errorMessages的{​​{1}}参数现在包含Actiontest的值。

答案 1 :(得分:1)

您可以使用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