【问题标题】:how to bind multiselect dropdown to asp.net controller action parameter如何将多选下拉列表绑定到 asp.net 控制器操作参数
【发布时间】:2011-02-22 06:13:34
【问题描述】:

我有一个 html 表单,它发布到一个 asp.net-mvc 控制器操作并且以前工作正常。我刚刚添加了一个新的多选下拉列表(使用 fcbkcomplete jquery 插件),我在将它绑定到我刚刚添加的绑定对象的新属性时遇到了问题

我只是列出:

 <select id="SponsorIds" name="SponsorIds"></select>

在 html 中,但看起来 fcbkcomplete 以某种方式将其更改为 name="SponsorIds[]"。

这是我在浏览器中显示“Selected Source”后得到的html。

<select multiple="multiple" style="display: none;" id="SponsorIds" name="SponsorIds[]">

这是从插件中吐出的所有 html

 <select multiple="multiple" style="display: none;" id="SponsorIds" name="SponsorIds[]">
<option class="selected" selected="selected" value="9">MVal</option>
</select>
<ul class="holder">
<li rel="9" class="bit-box">MVal<a href="#" class="closebutton"></a></li>
<li id="SponsorIds_annoninput" class="bit-input"><input size="1" class="maininput"    type="text"></li>
</ul>
<div style="display: none;" class="facebook-auto">
<ul style="width: 512px; display: none; height: auto;" id="SponsorIds_feed">
<li class="auto-focus" rel="9"><em>MVal</li></ul><div style="display: block;" class="default">Type Name . . .
</div>
</div>

这是我的控制器操作:

 public ActionResult UpdateMe(ProjectViewModel entity)
    {
    }

视图模型,ProjectViewModel有一个属性:

   public int[] SponsorIds { get; set; }

我认为可以很好地绑定到这个,但似乎没有,因为它只是在服务器端显示为“null”。有人能看出这里有什么问题吗?

【问题讨论】:

    标签: asp.net-mvc select model-binding fcbkcomplete


    【解决方案1】:

    一个正确命名的列表框(根据默认的 ASP.NET MVC 模型绑定器可以处理的内容)将是:

    name="SponsorIds"
    

    而不是:

    name="SponsorIds[]"
    

    至少如果您希望使用默认模型绑定器将其绑定回int[]。这就是 Html.ListBoxFor 助手生成的内容。示例:

    @Html.ListBoxFor(
        x => x.SponsorIds, 
        new SelectList(
            new[] { 
                new { Value = "1", Text = "MVal1" },
                new { Value = "2", Text = "MVal2" }, 
                new { Value = "3", Text = "MVal3" }, 
            }, 
            "Value", "Text"
        )
    )
    

    发射:

    <select id="SponsorIds" multiple="multiple" name="SponsorIds">
        <option value="1">MVal1</option>
        <option value="2">MVal2</option>
        <option value="3">MVal3</option>
    </select>
    

    模型绑定器很高兴。


    更新:

    您还可以拥有一个能够解析此的自定义模型绑定器:

    public class FCBKCompleteIntegerArrayModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[]");
            if (values != null && !string.IsNullOrEmpty(values.AttemptedValue))
            {
                // TODO: A minimum of error handling would be nice here
                return values.AttemptedValue.Split(',').Select(x => int.Parse(x)).ToArray();
            }
            return base.BindModel(controllerContext, bindingContext);
        }
    }
    

    然后在Application_Start注册这个活页夹:

    protected void Application_Start()
    {
        ...
        ModelBinders.Binders.Add(typeof(int[]), new FCBKCompleteIntegerArrayModelBinder());
    }
    

    【讨论】:

    • 我将其列为 name="SponsorIds" 但我似乎 fcbkcomplete 将其更改为 name="SponsorIds[]"。我不明白他们为什么要这样做。鉴于这是我无法控制的,有什么建议吗?我将问题编辑为清楚地表明 fcbkcomplete 将 [] 添加到我的选择名称属性
    • @ooo,这是您可以诅咒插件作者的情况之一,因为您不允许您指定字段名称(或者有吗?您是否顺便阅读了文档?)。好吧,我至少可以看到两种可能的解决方法:1. 编写自定义模型绑定器(请参阅我的更新)或 2. 订阅表单的 submit 事件并使用 jquery 执行巫毒魔法以重命名此字段以使默认模型绑定器快乐。
    • 我在这里找到了另一个“hack”:hypertrends.com/net/2010/03/11/…,您可以直接从 Request.Form 中获取这个字段。这个链接实际上提出了同样的观点,即 fcbkcomplete 将 [] 添加到属性中是多么荒谬
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多