我有以下简单的对象:
public class Thing
{
public int ThingID { get; set; }
public string ThingName { get; set; }
}
public class WrapperThing
{
public List<Thing> SelectedThings{ get; set; }
public List<Thing> UnselectedThings{ get; set; }
}
public class ThingStorageController
{
[HttpPost]
public ActionResult CreateThings(WrapperThing wt)
if(ModelState.IsValid){
//Modelstate has binding errors
}
}
}
我想要的是这样的http://jsfiddle.net/timotheus/7JHA4/
我现在拥有的是:
@using (Html.BeginForm("CreateThings", "ThingStorage"){
@Html.ListBoxFor(x => x.SelectedThings, new MultiSelectList(Model.SelectedThings,"ThingId", "ThingName")
<input id="thingSelect" type="button" value="<" />
<input id="thingDeselect" type="button" value=">" />
@Html.ListBoxFor(x => x.UnselectedThings, new MultiSelectList(Model.UnselectedThings,"ThingId", "ThingName")
}
这会给我模型错误帖子说它不能将字符串映射到Thing的对象类型,我认为这是正确的,因为它只发回所选对象的ID。有没有办法自己回发对象列表?
哦,作为奖励问题,您可能想在答案中考虑这个问题。我实际上想要回发每个列表的全部内容,而不仅仅是所选列表的内容。也许ListBoxFor()不是我真正想要的控件,你能为我想要实现的目标建议一个更好的选择吗?
答案 0 :(得分:1)
您可以实现自定义模型绑定器以将SelectedThings
和UnselectedThings
映射到包装器的实例。但是,您还想发布所有内容,这不是您的包装器模型的一部分。因此,我会尽量保持这一点。
收到帖子的ActionResult
必须接受参数int[] SelectedThings, int[] UnselectedThings
[HttpPost]
public ActionResult Submit(int[] SelectedThings, int[] UnselectedThings)
{
... your code ...
}
要提交所有内容,您可以实施第三个select
,其标识为AllThings
(可能包含style="display:none"
),可以使用SelectedThings
和{{的所有选项进行回填1}}。回填可以在表单的UnselectedThings
事件期间运行。
submit
如果您确实想要实现自定义模型绑定器,请查看this post
如果您关注该帖子,我建议继承$('form').submit(function() {
$('#SelectedThings option').appendTo('#AllThings');
$('#UnselectedThings option').appendTo('#AllThings');
}
。这是一个可以帮助您入门的粗略示例。
DefaultModelBinder
如帖子中所述,请确保在适当的位置注册模型装订器。