MVC ListBoxFor引发“值不能为空”的异常

时间:2010-02-18 13:01:30

标签: asp.net-mvc asp.net-mvc-2

我正在尝试使用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" />

<%} %>

3 个答案:

答案 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月发布中修复。