0

我有一个 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”。任何人都可以在这里看到任何问题吗?

4

1 回答 1

2

一个正确命名的列表框(根据默认的 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());
}
于 2011-02-21T21:38:46.000 回答