Как установить значение выпадающего списка приходя от модели в ASP.NET MVC

голоса
1

Я застрял на «как установить значение в выпадающем списке на значение, заданное в модели.

Я добавляю, что я до сих пор, и что я пытался.

Таким образом, у меня есть PaymentFormMVмодель и она имеет другую модель в ней , котораяPaymentCCMV

public class PaymentFormMV
{
    public PaymentCCMV CreditDetails { get; set; }
    public string ModelPropertyPrefixName
    {
        get
        {
            return this.ModelPropertyPrefix.Replace(_, .);
        }
    }
}
public class PaymentCCMV
{
    [Display(Name = Expiration Date)]
    public int ExpirationMonth { get; set; }
}

cshtml файл принимает данные от PaymentFormMV

<div class=form-group>
    @Html.LabelFor(model => model.CreditDetails.ExpirationMonth, htmlAttributes: new { @class = control-label col-md-2 required })
    <div class=col-md-10>
        @Html.DropDownList(Model.ModelPropertyPrefixName + CreditDetails.ExpirationMonth, Helpers.PossibleMonths,
        new { id = Model.ModelPropertyPrefix + CreditDetails_ExpirationMonth, @class = form-control, style = width:70px; })
    </div>
</div>

Helpers.PossibleMonths: отображает все месяцы

public static ICollection<SelectListItem> PossibleMonths
{
    get
    {
        return new List<SelectListItem>()
        {
            new SelectListItem() { Text = 1 - Jan, Value = 1 },
            new SelectListItem() { Text = 2 - Feb, Value = 2 },
            new SelectListItem() { Text = 3 - Mar, Value = 3 },
            new SelectListItem() { Text = 4 - Apr, Value = 4 },
            new SelectListItem() { Text = 5 - May, Value = 5 },
            new SelectListItem() { Text = 6 - Jun, Value = 6 },
            new SelectListItem() { Text = 7 - Jul, Value = 7 },
            new SelectListItem() { Text = 8 - Aug, Value = 8 },
            new SelectListItem() { Text = 9 - Sep, Value = 9 },
            new SelectListItem() { Text = 10 - Oct, Value = 10 },
            new SelectListItem() { Text = 11 - Nov, Value = 11 },
            new SelectListItem() { Text = 12 - Dec, Value = 12 },
        };
    }
}

Точки:

Я получаю целое значение model.CreditDetails.ExpirationMonth = 2(как в БД)

Но я не знаю , как установить его в раскрывающемся списке. Поэтому , когда экран нагрузки я хочу , что значение , которое будет связано с выпадающего меню. Пожалуйста , руководство меня. Так, если значение равно 2 , я должен получить что - то вроде 2 - Febв Dropdown UI , как упомянуто в методе Helper. Я новичок , так что я не мог следовать лучшей практике так , медведь со мной на этом.

HTML СГЕНЕРИРОВАННОЕ:

введите

Задан 14/11/2016 в 14:37
источник пользователем
На других языках...                            


2 ответов

голоса
2

Я второй @ ответ Вивьен, но я бы рекомендовал использовать перегрузку , которая принимает выбранное значение ( см MSDN: ), которые вы можете установить. Для того, чтобы затем позволяют перейти в по умолчанию, я также рекомендовал бы использовать статический метод, и позволяя месяц проходить в:

public static SelectList PossibleMonths(string defaultValue)
{
        return new SelectList(List<SelectListItem>()
        {
            new SelectListItem() { Text = "1 - Jan", Value = "1" },
            new SelectListItem() { Text = "2 - Feb", Value = "2" },
            new SelectListItem() { Text = "3 - Mar", Value = "3" },
            new SelectListItem() { Text = "4 - Apr", Value = "4" },
            new SelectListItem() { Text = "5 - May", Value = "5" },
            new SelectListItem() { Text = "6 - Jun", Value = "6" },
            new SelectListItem() { Text = "7 - Jul", Value = "7" },
            new SelectListItem() { Text = "8 - Aug", Value = "8" },
            new SelectListItem() { Text = "9 - Sep", Value = "9" },
            new SelectListItem() { Text = "10 - Oct", Value = "10" },
            new SelectListItem() { Text = "11 - Nov", Value = "11" },
            new SelectListItem() { Text = "12 - Dec", Value = "12" },
        }, "Value", "Text", defaultValue);
}

EDIT: Ваш выпадающий мог бы выглядеть следующим

@Html.DropDownList(Model.ModelPropertyPrefixName + "CreditDetails.ExpirationMonth", Helpers.PossibleMonths(Model.CreditDetails.ExpirationMonth),
                new { id = Model.ModelPropertyPrefix + "CreditDetails_ExpirationMonth", @class = "form-control", style = "width:70px;" })

Это предполагает, что объект CreditDetails всегда не равно нулю, в противном случае нулевой проверки является обязательным.

EDIT: Я был неправильно, по-видимому, Html.DropDownList не поддерживает SelectList, поэтому я вернулся обратно к оригинальному подходу с закруткой для установки выбранного значения (заметим, такое же падение вниз код выше для этой работы).

public static IEnumerable<SelectListItem> PossibleMonths(string defaultValue)
{
        if (defaultValue == null)
           defaultValue = "";

        return new List<SelectListItem>()
        {
            new SelectListItem() { Text = "1 - Jan", Value = "1", Selected = (defaultValue == "1") },
            new SelectListItem() { Text = "2 - Feb", Value = "2", Selected = (defaultValue == "2") },
            new SelectListItem() { Text = "3 - Mar", Value = "3", Selected = (defaultValue == "3") },
            new SelectListItem() { Text = "4 - Apr", Value = "4", Selected = (defaultValue == "4") },
            new SelectListItem() { Text = "5 - May", Value = "5", Selected = (defaultValue == "5") },
            new SelectListItem() { Text = "6 - Jun", Value = "6", Selected = (defaultValue == "6") },
            new SelectListItem() { Text = "7 - Jul", Value = "7", Selected = (defaultValue == "7") },
            new SelectListItem() { Text = "8 - Aug", Value = "8", Selected = (defaultValue == "8") },
            new SelectListItem() { Text = "9 - Sep", Value = "9", Selected = (defaultValue == "9") },
            new SelectListItem() { Text = "10 - Oct", Value = "10", Selected = (defaultValue == "10") },
            new SelectListItem() { Text = "11 - Nov", Value = "11", Selected = (defaultValue == "11") },
            new SelectListItem() { Text = "12 - Dec", Value = "12", Selected = (defaultValue == "12") },
        };
}
Ответил 14/11/2016 в 15:30
источник пользователем

голоса
1

В DropDownList()(и предпочтительные DropDownListFor()методы работы путем связывания с стоимости вашего имущества. В вашем случае, вы хотите привязать к ExpirationMonthсобственности, код на ваш взгляд , должно быть

@Html.DropDownList("CreditDetails.ExpirationMonth", Helpers.PossibleMonths, new { @class = "form-control", style = "width:70px;" }

или лучше

@Html.DropDownListFor(m => m.CreditDetails.ExpirationMonth, Helpers.PossibleMonths, new { @class = "form-control", style = "width:70px;" }

и если вы установите значение ExpirationMonthсказать 3в методе GET и передать модель с точки зрения, то будет выбран третий вариант ( «Mar»).

Не ясно , что ваши ModelPropertyPrefixи ModelPropertyPrefixNameсвойства возвращают, однако они не являются обязательными, и не должен использоваться , когда в представлении (то HtmlHelperметоды всегда будут генерировать правильные nameатрибуты , необходимые для связывания 2-полосная модели).

Следует также отметить , что это распространенное заблуждение полагать , что Selectedимущество SelectListItemдолжно быть установлено при генерации SelectList. При привязке к модели собственности, DropDownList()и DropDownListFor()методы внутренне создавать свои собственные IEnumerable<SelectListItem>и установить Selectedсвойства на основании стоимости имущества (любая попытка установить его самостоятельно игнорируется). Единственный раз , когда Selectedсвойство соблюдается, когда вы используете DropDownList("xxx", ...)и xxxне является свойством или модель.

В качестве примечания, код в статическом методе может быть только

public static IEnumerable<SelectListItem> PossibleMonths()
{
    return Enumerable.Range(1, 12).Select(x => new SelectListItem()
    {
        Value = x.ToString(),
        Text = System.Globalization.CultureInfo.CurrentCulture.DateTimeForm‌at.GetMonthName(x)
    });
}

и ваш вид модель не должна содержать свойства, модели данных при редактировании данных. PaymentFormMVдолжны содержать public int ExpirationMonth { get; set; }(и другие свойства PaymentCCMVвам нужно), неpublic PaymentCCMV CreditDetails { get; set; }


На основе вашего редактирования показывает изображение HTML, ваш генерируя nameатрибут , который не относится к вашей PaymentFormMVмодели, которая используется в целях (он не имеет свойства с именем PaymentInfo) и , следовательно , вы не правильно привязкой к модели, и правильный вариант не будет выбран.

Из комментариев в чате, вам необходимо изменить вид использования , @model MoveInMVа затем метод будет

@Html.DropDownListFor(m => m.PaymentInfo.CreditDetails.ExpirationMonth, Helpers.PossibleMonths, ...)

дать правильную модель 2-полосная привязки.

Ответил 15/11/2016 в 21:57
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more