@ Html.ListBoxFor可以返回所选项而不是键吗?

时间:2015-01-27 12:14:02

标签: asp.net-mvc razor model-binding

我有以下简单的对象:

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()不是我真正想要的控件,你能为我想要实现的目标建议一个更好的选择吗?

1 个答案:

答案 0 :(得分:1)

您可以实现自定义模型绑定器以将SelectedThingsUnselectedThings映射到包装器的实例。但是,您还想发布所有内容,这不是您的包装器模型的一部分。因此,我会尽量保持这一点。

收到帖子的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

如帖子中所述,请确保在适当的位置注册模型装订器。