Шаблон редактора для DropDownList, невозможно привязать свойство из представления к шаблону - PullRequest
0 голосов
/ 30 мая 2019

У меня есть шаблон редактора для DropDownList

@model object
<div class='form-fields @ViewData["class"]'>
@Html.LabelFor(x => x, new { @class = "form-fields__label" })
@Html.DropDownListFor(x => x, (SelectList)ViewData["selectList"], new { @class = "form-fields__input width-max d-block " + @ViewData["inputClass"]})
@Html.ValidationMessageFor(x => x, "", new { @class = "form-fields__form-error" })

И я читаю данные списка из View, используя ViewData, но получаю ошибку, что System.String не имеет свойства 'P' (это мой статус). Я думаю, что это происходит потому, что когда данные попадают в мой шаблон, он читает только значение, а не свойство. Есть ли обходной путь для этого?

View

@Html.EditorFor(x => x.AdminForEdit.Status.Status, "DropDownList", new { selectList = new SelectList(MDC.Models.Accounts.UserStatus.GetStatuses(), Model.AdminForEdit.Status.Status, NinjectWebCommon.Dictionary.GetLocalization(Model.Device.Language.LanguageId, Model.AdminForEdit.Status.Name), Model.AdminForEdit.Status.Status)})

UserStatus класс

public class UserStatus
{
    public string Status { get; set; }
    public string Name { get; set; }
    public bool AlowLogIn { get; set; }
    public string ErrorMessage { get; set; }

    public UserStatus()
    {

    }

    public UserStatus(string status, string name, bool alowLogin, string errorMessage)
    {
        Status = status;
        Name = name;
        AlowLogIn = alowLogin;
        ErrorMessage = errorMessage;
    }

    public static UserStatus Pending = new UserStatus("P", "L_USERSTATUS_PENDING", false, "L_ADMIN_LOGIN_ERRORUSERPENDING");

    public static UserStatus Active = new UserStatus("A", "L_USERSTATUS_ACTIVE", true, "L_ADMIN_LOGIN_WRONGCREDENTIALS");

    public static UserStatus Blocked = new UserStatus("B", "L_USERSTATUS_BLOCKED", false, "L_ADMIN_LOGIN_ERRORUSERBLOCKED");

    public static UserStatus Deleted = new UserStatus("D", "L_USERSTATUS_DELETED", false, "L_ADMIN_LOGIN_ERRORUSERBLOCKED");

    public static UserStatus Unknown = new UserStatus("X", "L_USERSTATUS_UNKNOWN", false, "L_ADMIN_LOGIN_ERRORUSERBLOCKED");

    public static List<UserStatus> GetStatuses()
    {
        return new List<UserStatus> { Pending, Active, Blocked, Deleted };
    }

    public static UserStatus GetStatus(string status)
    {
        switch (status)
        {
            case "P":
                return Pending;
            case "A":
                return Active;
            case "B":
                return Blocked;
            case "D":
                return Deleted;
            default:
                return Unknown;
        }
    }
}

1 Ответ

0 голосов
/ 30 мая 2019

Итак, как сказал @vikscool, я исправил эту проблему, используя (IEnumerable<SelectListItem>)ViewData["selectList"] в своем шаблоне, и в виду, я выбираю пункт, как это:

@Html.EditorFor(x => x.AdminForEdit.Status.Status, "DropDownList", new { selectList = MDC.Models.Accounts.UserStatus.GetStatuses().Select(x => new SelectListItem()
                           {
                                Text = NinjectWebCommon.Dictionary.GetLocalization(Model.Device.Language.LanguageId, x.Name),
                                Value = x.Status
                           }) })
...