我正在使用模型视图控制器结构的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]"
。而我期待收到实际的收藏品。
为什么会这样?或者如何解决?
答案 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}}参数现在包含Action
和test
的值。
答案 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