MVC - 从ListBoxFor获取ViewModel对象

时间:2011-01-09 19:47:26

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

我在提交表单后尝试获取自己的viewmodel,我收到以下错误: “无法将'System.String []'类型的对象强制转换为'System.String'”

这是我的代码:

VIEWMODE:

public class SoftwarePackages
{
 public string[] PermissionsList { get; set; }
}

ASPX

<%: Html.ListBoxFor(model => model.PermissionsList, new List<SelectListItem>(), new { size = 10 })%>

控制器

[HttpPost]
public ActionResult Index(SoftwarePackages softwarePackages)
{
  code...code...code
}

问题是什么?

谢谢

zurdoIL

3 个答案:

答案 0 :(得分:6)

以下对我来说很好:

型号:

public class SoftwarePackages
{
    public string[] PermissionsList { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new SoftwarePackages
        {
            Items = new SelectList(new[]
            {
                new SelectListItem { Value = "1", Text = "item 1" },
                new SelectListItem { Value = "2", Text = "item 2" },
                new SelectListItem { Value = "3", Text = "item 3" },
            }, "Value", "Text")
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(SoftwarePackages softwarePackages)
    {
        // do something with softwarePackages.PermissionsList
        ...
    }
}

查看:

<% using (Html.BeginForm()) { %>
    <%: Html.ListBoxFor(model => model.PermissionsList, Model.Items, new { size = 10 })%>
    <input type="submit" value="OK" />
<% } %>

答案 1 :(得分:1)

我发现了问题:

在我的viewmodel中,我有以下属性:

[Required(ErrorMessage = "Please provide a Description!")]
[StringLength(255, ErrorMessage = "Description must be less than 255 characters!")]
[DisplayName("Description")]

当然“StringLength”属性试图将此字段转换为字符串。

感谢您的帮助!

zurdoIL

答案 2 :(得分:0)

另外,您将无法使用您显示的代码恢复模型。 ListBoxFor(和DropDownListFor)辅助方法使用IEnumerable<SelectListItem>实际呈现其内容,并将SelectListItems的空集合传递给方法。您可以使用这些扩展方法从任何IEnumerable<SelectListItem>创建IEnumerable<string>

public static class IEnumerableStringExtensions
{
    public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items)
    {
        return IEnumerableStringExtensions.ToSelectListItemList(items, new List<string>());
    }

    public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items, string selectedValue)
    {
        return IEnumerableStringExtensions.ToSelectListItemList(items, new List<string>());
    }

    public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items, IEnumerable<string> selectedValues)
    {
        List<SelectListItem> listitems = new List<SelectListItem>(items.Count());

        foreach (string s in items)
        {
            listitems.Add(new SelectListItem()
            {
                Text = s,
                Value = s,
                Selected = selectedValues.Contains(s)
            });
        }

        return listitems;
    }
}

使用以下方法:

<%:Html.ListBoxFor(m => m.PermissionList, Model.PermissionList.ToSelectListItemList(), new { size = 10 })%>

使用示例项目我无法从您提供的代码中复制您的异常(PermissionList只是null),但至少上面的类会将您的模型返回到服务器(更准确地说是用户从列表中选择的值。)