【发布时间】:2011-06-21 03:15:14
【问题描述】:
我有一个页面,其中包含两个列表,一个为空,一个填充了值,两者的结构相同。用户可以从填充列表中选择一个项目,单击一个按钮,它将通过 jQuery 移动到空列表。提交表单后,我将所有选项 ID 保存到隐藏的表单字段中,以便稍后在发布后解析出来。但是,当我提交页面时,如果我将一个值从一个列表框移动到另一个,我会遇到以下错误(否则,页面正常发布):
System.InvalidOperationException: The parameter conversion from type
'System.String' to type 'System.Web.Mvc.SelectListItem' failed because no type
converter can convert between these types. at
System.Web.Mvc.ValueProviderResult.ConvertSimpleType(CultureInfo culture, Object value, Type destinationType) at
System.Web.Mvc.ValueProviderResult.UnwrapPossibleArrayType(CultureInfo culture, Object value, Type destinationType) at
System.Web.Mvc.ValueProviderResult.ConvertTo(Type type, CultureInfo culture) at
System.Web.Mvc.ValueProviderResult.ConvertTo(Type type) at
System.Web.Mvc.DefaultModelBinder.ConvertProviderResult(ModelStateDictionary modelState, String modelStateKey, ValueProviderResult valueProviderResult, Type destinationType)
以下是相关代码:
视图模型:
public class ViewModel
{
public IEnumerable<SelectListItem> currentUsers { get; set; }
public IEnumerable<SelectListItem> availableUsers { get; set; }
}
初始控制器动作:
public ActionResult Index()
{
IEnumerable<User> availableUsers = SomeDal.GetUsers();
var model = new ViewModel
{
currentUsers = Enumerable.Empty<User>().Select(x => new SelectListItem
{
Value = x.id.ToString(),
Text = x.name
}),
availableUsers = availableUsers.Select(x => new SelectListItem
{
Value = x.id.ToString(),
Text = x.lastName
})
};
}
POST 控制器动作:
[HttpPost]
public ActionResult Index(ViewModel model)
{
// at this point, ModelState.IsValid is already true, so I figure the rest of this isn't necessary
}
移动项目的jQuery:
$('#swapUsers').click(function () {
$('#availableUsers option:selected').appendTo('#currentUsers');
});
列表框::
@Html.ListBox(
"currentUsers",
new SelectList(Model.currentUsers, "value", "text"),
new { @class = "listbox" }
)
@Html.ListBox(
"availableUsers",
new SelectList(Model.availableUsers, "value", "text"),
new { @class = "listbox" }
)
我一开始以为是因为我奇怪的 Enumerable.Empty 调用,但是即使 currentUsers IEnumerable 包含数据也会发生错误。
编辑 1:
HTML 预发布
<select class="listbox" id="currentUsers" multiple="multiple" name="currentUsers"></select>
<select class="listbox" id="availableUsers" multiple="multiple" name="availableUsers">
<option value="1">Test User 1</option>
<option value="2">TestUser2</option>
</select>
HTML 发布后
<select class="input-validation-error listbox" id="currentUsers" multiple="multiple" name="currentUsers">
<option selected="selected" value="1">Test User 1</option>
</select>
<select class="listbox" id="availableUsers" multiple="multiple" name="availableUsers">
<option value="2">TestUser2</option>
</select>
【问题讨论】:
-
嗯。我认为如果您提供 2 个列表的 HTML 内容以及该错误消息的堆栈跟踪,将会很有帮助。
标签: asp.net-mvc