我在提交表单后尝试获取自己的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
答案 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),但至少上面的类会将您的模型返回到服务器(更准确地说是用户从列表中选择的值。)