MVC 3 - 从回发列表框中获取所有选定的值

Posted

技术标签:

【中文标题】MVC 3 - 从回发列表框中获取所有选定的值【英文标题】:MVC 3 - Getting all selected values from a listbox on postback 【发布时间】:2011-11-11 14:41:29 【问题描述】:

我有一个 MVC3 项目,它有一个这样的列表框 (listboxfor):

@html.ListBoxFor(m => m.cat_fam_codes, new SelectList(BaanWrapper.GetAllCategoryFamilies(), "Code", "Description"), new  @size = "10" )

在测试时,我可以在列表中选择多个条目,甚至添加了一个事件处理程序,以在选择它们时弹出所选值的逗号限制列表。但是,当我将表单发布回控制器时,我只会返回第一个选定的值。例如,如果我选择值 1,2,3,4 - 我的 JQuery 事件处理程序将弹出“1,2,3,4”。没问题 - 但在回发时,控制器中引用的绑定对象仅显示“1”。

[HttpPost]
public ActionResult Create(EventReport eventReport)

    return View(eventReport);

任何帮助将不胜感激。

编辑:

这是 EventReport 数据模型/类:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace EWS.Models

    [MetadataType(typeof(EventReportMetaData))]
    public partial class EventReport
    
        private static readonly EWSDataContext db = new EWSDataContext();

        #region Nested type: MetaData

        private sealed class EventReportMetaData
        
            [DisplayName("Alert Email Body")]
            [Required(ErrorMessage = "Required")]
            public string alert_body  get; set; 

            [DisplayName("Alert Email Subject")]
            [Required(ErrorMessage = "Required")]
            public string alert_subject  get; set; 

            [DisplayName("Categories")]
            public string cat_codes  get; set; 

            [DisplayName("Category Families")]
            public string cat_fam_codes  get; set; 

            [DisplayName("CCR Codes")]
            public string ccr_codes  get; set; 

            [Required(ErrorMessage = "Required")]
            public DateTime create_dtm  get; set; 

            [Required(ErrorMessage = "Required")]
            public int created_by  get; set; 

            [DisplayName("Email List")]
            [Required(ErrorMessage = "Required")]
            [IsInteger(ErrorMessage = "Invalid Email List")]
            [IsGreaterThanZero(ErrorMessage = "Required")]
            public int email_list_id  get; set; 

            [DisplayName("Begin Date")]
            public DateTime begin_dtm  get; set; 

            [DisplayName("End Date")]
            public DateTime end_dtm  get; set; 

            [DisplayName("Event Threshold")]
            [Required(ErrorMessage = "Required")]
            [IsInteger(ErrorMessage = "Invalid Threshold")]
            public int event_count  get; set; 

            [DisplayName("Disabled")]
            public bool is_disabled  get; set; 

            [DisplayName("Notify Over Threshold")]
            [Required(ErrorMessage = "Required")]
            public bool notify_over_events  get; set; 

            [DisplayName("Notify Under Threshold")]
            [Required(ErrorMessage = "Required")]
            public bool notify_under_events  get; set; 

            [Required(ErrorMessage = "Required")]
            public int report_id  get; set; 

            [DisplayName("Report Title")]
            [Required(ErrorMessage = "Required")]
            public string report_title  get; set; 

            [DisplayName("Reset By")]
            public int reset_by  get; set; 

            [DisplayName("Reset Date")]
            public DateTime reset_dtm  get; set; 

            [DisplayName("SKUs")]
            public string skus  get; set; 

            [DisplayName("Source System")]
            [Required(ErrorMessage = "Required")]
            public string source_system  get; set; 

            [DisplayName("Sub-Categories")]
            public string sub_cat_codes  get; set; 

            [DisplayName("# of Time Units")]
            [Required(ErrorMessage = "Required")]
            public int window_dt_part_count  get; set; 

            [DisplayName("Unit of Time")]
            [Required(ErrorMessage = "Required")]
            public string window_dt_part  get; set; 
        

        #endregion
    

谢谢!

【问题讨论】:

你的 eventReport 模型是什么样的? 【参考方案1】:

尝试将属性类型更改为 string[] 或 int[]。我认为默认模型绑定器需要一个数组,因为在你的情况下它不是一个数组,它只是用第一个选定的值填充它。如果您必须坚持使用这个模型类,您可能需要调整绑定(例如,使用自定义模型绑定器)。

【讨论】:

【参考方案2】:

好的,营员们,这就是我所做的……我将使用 cat_code 的一个下拉列表(来自我的数据库模型)作为示例。

像这样修改了我的模型类:

public IList<string> SelectedCategoryCodes

    get
    
        if (string.IsNullOrWhiteSpace(cat_codes))
            return new List<string>();

        return cat_codes.Split(',').ToList();
    
    set  cat_codes = string.Join(",", value.ToArray()); 

接下来我有

private sealed class EventReportMetaData

    ....
    [DisplayName("Categories")]
    public string cat_codes  get; set; 
    ....

由于我将多个选定的值作为逗号分隔的字符串存储在数据库中,因此我将其添加到 MVC 模型中,以便存储在该字段 (cat_codes) 中的数据可以在视图中读取和写入。

然后在我看来,我将 ListBoxFor 声明更改为如下所示:

    @Html.ListBoxFor(m => m.SelectedCategoryCodes, new SelectList(BaanWrapper.GetAllCategories(), "Code", "Description"), new @size = "10")

就是这样。由于我的数据库模型已经有一个 cat_codes 字段,所以一切都到位了。

希望这对某人有所帮助。

【讨论】:

以上是关于MVC 3 - 从回发列表框中获取所有选定的值的主要内容,如果未能解决你的问题,请参考以下文章

我如何从 mvc 的剑道 ui 网格的下拉列表中获取选定的值

如何在 Asp.net MVC4 中避免回发

如何使用 jquery 从 asp.net 列表框中仅获取当前选定的选项

如何在 Kendo UI MVC 的网格中设置和获取下拉列表的值?

在ListBox选择之后更新Modal中的TextBox

返回列表框中的选定值