将 ListBoxFor(多个)绑定回模型

Posted

技术标签:

【中文标题】将 ListBoxFor(多个)绑定回模型【英文标题】:Bind ListBoxFor (Multiple) back to Model 【发布时间】:2012-05-14 04:31:54 【问题描述】:

我有一个 MVC 视图,它使用下面的 Razor 语法呈现基本上等同于 KeyValuePair 的内容,然后生成以下 html

@Html.DropDownListFor(x => x.SelectedItems, new SelectList(Model.SelectedItems, "Key", "Key"), new  Class = "selectList selectedList", size = "2" )

HTML:

<select class="selectList selectedList" id="SelectedItems" name="SelectedItems" size="2">
   <option value="842">Item 1</option>
   <option value="326">Item 2</option>
   <option value="327">Item 3</option>
</select>

我正在使用 Jquery 和通用函数手动发布表单来发布我们的表单,如下所示:

function GenericSubmit(formSelector, sender, callback) 
    if (typeof (sender) != "undefined" && $(sender).hasClass('disabled')) 
        return false;
    

    var $that = $(formSelector);
    var that = $that.get(0);
    if ($that.valid()) 
        $.ajax(
            url: that.action,
            type: that.method,
            data: $(that).serialize(),
            success: function (data, textStatus, jqXHR) 
                callback.call(that, data);
            
        );
    
    return false;

但是我遇到的问题是,只有正在发送的数据是实际值(我希望这就是 JQ 的工作方式..),但我需要绑定到 IEnumerable。

通过查看发送到表单的 POST 数据,我只能看到正在发送的以下值 - 我可以预料到为什么我的模型有一个空集合。

SelectedItems:842
SelectedItems:326
SelectedItems:327

我的模型如下:

/// <summary>
/// An response for dealing with list type entities
/// </summary>
public class ListEntityResponse : EntityScreenResponse

    /// <summary>
    /// Contains a Enumerable of items that can be selected
    /// </summary>
    public List<KeyValueViewModel> AvailableItems  get; set; 

    /// <summary>
    /// Contains a Enumerable of items that have been selected
    /// </summary>
    public List<KeyValueViewModel> SelectedItems  get; set; 

    public ListEntityResponse()
    
        AvailableItems = new List<KeyValueViewModel>();

        SelectedItems = new List<KeyValueViewModel>();
    



为了更加清晰 - 这是我的 KeyValueViewModel:

 public class KeyValueViewModel
    
        public string Key  get; set; 

        public string Value  get; set; 
    

我已经为此搜索了高低,但似乎找不到任何有效的主题,任何帮助将不胜感激!

谢谢,

【问题讨论】:

【参考方案1】:

//刚刚意识到我看错了你的问题。

如果你想绑定多个值,你需要使用 ListBoxFor

//

那么,如果您的后端可能已经拥有这些信息,为什么还需要控制器从视图中接收所有这些信息?

只关心您在表单中提交的内容是有意义的。

如果您需要重新填充此数据以再次呈现视图(因为存在验证错误,这是一种优雅的方法)

http://www.paulstovell.com/clean-aspnet-mvc-controllers

【讨论】:

是的,我会把它放在我的后端,但我真的不想再次访问数据库,因为这些数据。但我同意它应该只关心表单中提交的内容。 .. 但另一方面,我确实需要它作为 IEnum,因为它将用于渲染项目,以便他们可以在那里编辑选择。感谢您的链接 - 我会仔细阅读,看看 Chuck Norris 怎么说! 恐怕还是不高兴,我添加了一张图片来帮助说明我的问题

以上是关于将 ListBoxFor(多个)绑定回模型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mvc3 中填充 ListBoxFor?

当 Ajax 调用中的下拉列表更改时 ListboxFor 不绑定

使用 AngularJS 将所​​选值绑定到多选 ListboxFor 控件

ListBoxFor 未在提交时完全更新视图模型

无法获得 @Html.ListBoxFor() 的正确语法

如何让 MultiSelectList 绑定到我的数据模型?