MVC 3 - Получение всех выбранных значений из списка при обратной передаче - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть проект 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 ]

1 голос
/ 07 сентября 2011

Попробуйте изменить тип свойства на string [] или int []. Я думаю, что связыватель модели по умолчанию ожидает массив, и, поскольку в вашем случае это был не массив, он просто заполнил его первым выбранным значением. Если вам необходимо придерживаться этого класса модели, вам, возможно, придется настроить привязку (например, с помощью настроенного подшивки модели).

0 голосов
/ 08 сентября 2011

Хорошо, туристы, вот что я сделал ... Я буду использовать один выпадающий список для 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, все стало на свои места.

Надеюсь, это кому-нибудь поможет.

...