3

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

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

4

2 回答 2

3

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

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

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

要了解为什么这是必要的,请阅读 Phil Haack 的博客文章:模型绑定到列表。这是一个简单的示例,向您展示如何执行此操作:

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参数 forAction现在将包含和test的值test2

于 2012-08-09T13:26:19.380 回答
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

于 2012-08-09T13:18:16.140 回答