【问题标题】:MVC - Getting ViewModel object from ListBoxForMVC - 从 ListBoxFor 获取 ViewModel 对象
【发布时间】:2011-01-09 19:47:26
【问题描述】:

我在提交表单后尝试获取自己的视图模型,但出现以下错误: “无法将 'System.String[]' 类型的对象转换为 'System.String' 类型”

这是我的代码:

查看模式:

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

【问题讨论】:

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


    【解决方案1】:

    以下对我来说很好用:

    型号:

    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" />
    <% } %>
    

    【讨论】:

      【解决方案2】:

      我发现了问题:

      在我的视图模型中,我具有以下属性:

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

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

      感谢您的帮助!

      zurdoIL

      【讨论】:

        【解决方案3】:

        顺便说一句,您将无法使用您显示的代码恢复您的模型。 ListBoxFor(和DropDownListFor)辅助方法使用IEnumerable&lt;SelectListItem&gt; 来实际呈现它们的内容,并且您将SelectListItems 的空集合传递给该方法。您可以使用这些扩展方法从任何IEnumerable&lt;string&gt; 创建一个IEnumerable&lt;SelectListItem&gt;

        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 只是空),但至少上面的类会将您的模型返回到服务器(更准确地说是从列表中选择的用户)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-06
          • 1970-01-01
          • 2017-08-17
          • 1970-01-01
          相关资源
          最近更新 更多