我正在尝试使用Html.ListBoxFor帮助器来显示列表框并返回所选的Id。 dataValueField不是字符串有问题吗?
如果模型中包含的SelectList使用整数作为dataValueField,那么当在视图中呈现列表时,我会得到“值不能为null - 参数名称:源”异常。
如果将Id更改为字符串,则一切正常,所选的Id将传回视图。
有什么想法吗?
这是控制器(基于减少的新项目)
namespace Mvc2.Controllers
{
public class ViewModel
{
public int TestId { get; set; } // if this is a string it works ok
public SelectList ListData {get; set;}
}
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new ViewModel();
model.TestId = 1; // code corrected after Lazarus' comment
var lst = new[] { new { Id = 1, Name = "cat" }, new { Id = 2, Name = "dog" } };
model.ListData = new SelectList(lst, "Id", "Name");
return View("TestView", model);
}
public ActionResult TestSubmit(ViewModel returnedModel)
{
int i = 99; // break here - returnedModel has correct TestId when declared as string
}
}
}
这是ListBoxFor行上的View - 崩溃
<%using (Html.BeginForm("TestSubmit", "Home")) { %>
<%=Model.TestId %><br />
<%=Html.ListBoxFor(m => m.TestId, Model.ListData) %>
<br />
<input type="submit" value="Save" />
<%} %>
答案 0 :(得分:3)
您为所选值传递的表达式需要是IEnumerable,因为ListBoxFor支持多个选定项。
答案 1 :(得分:2)
回答我自己的问题;
我对这可能是一个等待修复的错误的评论没有意见,因为我在RC2和MVC 1中得到它(我将代码复制回该版本中的项目)。 无论如何,我现在已经实施了一项工作,即: -
(a)将Id的虚拟字符串版本添加到模型(TestId)
public class ViewModel
{
public string TestId { get; set; } // dummy Id as a string
public List<DataToShow> Data { get; set; }
public SelectList ListData {get; set;}
}
(b)显示列表但检索值为虚拟TestId - 请注意列表仍然将数据值转储为整数!
<%=Html.ListBoxFor(m => m.TestId, Model.ListData) %>
(c)将虚拟字符串值复制到操作
中的正确整数位置public ActionResult TestSubmit(ViewModel returnedModel)
{
MyModel.DataId = Int32.Parse(returnedModel.TestId);
希望这是一些帮助。
答案 2 :(得分:1)
这是known issue with ASP.NET MVC 2。它应该在3月发布中修复。