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

时间:2011-09-06 19:29:39

标签: asp.net-mvc-3 html.listboxfor

我有一个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
    }
}

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

好的露营者在这里是我做的......我将使用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字段,所以一切都已到位。

希望这有助于某人。