выпадающий список проверки сообщения mvc - PullRequest
3 голосов
/ 22 июля 2011

На мой взгляд, модель у меня есть

public string Addressline1 { get; set; }
public List<SelectListItem> StateList
    {
        get
        {
            return State.GetAllStates().Select(state => new SelectListItem { Selected = false, Text = state.Value, Value = state.Value }).ToList();
        }
    }

В представлении у меня есть

@Html.DropDownListFor(model => model.StateCode, Model.StateList, "select")

при вводе AddressLine1 выбор списка DropDownList из списка состояний является обязательным. Как проверить и показать сообщение об ошибке, если в раскрывающемся списке не выбрано ни одно состояние, кроме значения по умолчанию «select»?

1 Ответ

8 голосов
/ 22 июля 2011

Укажите свойство StateCode с атрибутом [Required]:

[Required(ErrorMessage = "Please select a state")]
public string StateCode { get; set; }

public IEnumerable<SelectListItem> StateList
{
    get
    {
        return State
            .GetAllStates()
            .Select(state => new SelectListItem 
            { 
                Text = state.Value, 
                Value = state.Value 
            })
            .ToList();
    }
}

, а затем вы можете добавить соответствующее сообщение об ошибке проверки:

@Html.DropDownListFor(model => model.StateCode, Model.StateList, "select")
@Html.ValidationMessageFor(model => model.StateCode)

ОБНОВЛЕНИЕ:

Хорошо, похоже, вы хотите условно проверить это свойство StateCode в зависимости от какого-либо другого свойства в вашей модели представления.Теперь это совсем другая история, и вы должны были объяснить это в своем первоначальном вопросе.В любом случае, одна возможность состоит в том, чтобы написать собственный атрибут проверки:

public class RequiredIfPropertyNotEmptyAttribute : ValidationAttribute
{
    public string OtherProperty { get; private set; }
    public RequiredIfPropertyNotEmptyAttribute(string otherProperty)
    {
        if (otherProperty == null)
        {
            throw new ArgumentNullException("otherProperty");
        }
        OtherProperty = otherProperty;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var property = validationContext.ObjectType.GetProperty(OtherProperty);
        if (property == null)
        {
            return new ValidationResult(string.Format(CultureInfo.CurrentCulture, "{0} is an unknown property", new object[]
            {
                OtherProperty
            }));
        }
        var otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null) as string;
        if (string.IsNullOrEmpty(otherPropertyValue))
        {
            return null;
        }

        if (string.IsNullOrEmpty(value as string))
        {
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        }

        return null;
    }
}

и теперь украсить ваше свойство StateCode этим атрибутом, например так:

public string AddressLine1 { get; set; }

[RequiredIfPropertyNotEmpty("AddressLine1", ErrorMessage = "Please select a state")]
public string StateCode { get; set; }

Теперь при условии, что у вас естьследующая форма:

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.AddressLine1)
        @Html.EditorFor(x => x.AddressLine1)
    </div>

    <div>
        @Html.LabelFor(x => x.StateCode)
        @Html.DropDownListFor(x => x.StateCode, Model.States, "-- state --")
        @Html.ValidationMessageFor(x => x.StateCode)
    </div>

    <input type="submit" value="OK" />
}

раскрывающийся список StateCode потребуется только в том случае, если пользователь ввел значение в поле AddressLine1.

...