Как сделать обязательные атрибуты в ASP MVC? - PullRequest
3 голосов
/ 03 ноября 2011

У меня есть приложение MVC, в котором есть DropDownList и TextBox.Я использую проверку MVC, и я доволен этим.

На данный момент DropDownList является [Обязательным], но я хочу сделать так, чтобы TextBox мог функционировать как ввод в стиле «другой: пожалуйста, укажите» для DropDownList.

Как мне сделать так, чтобы атрибут [Required] в DropDownList был условным, если TextBox пуст?

Этот вопрос похож, но ему больше года.Что-нибудь в текущей версии MVC, которая делает это легко сделать?

Ответы [ 2 ]

8 голосов
/ 03 ноября 2011

Было бы довольно легко написать собственный атрибут проверки:

public class RequiredIfPropertyIsEmptyAttribute : RequiredAttribute
{
    private readonly string _otherProperty;
    public RequiredIfPropertyIsEmptyAttribute(string 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("Unknown property {0}", _otherProperty));
        }

        var otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null);
        if (otherPropertyValue == null)
        {
            return base.IsValid(value, validationContext);
        }
        return null;
    }
}

, тогда вы могли бы иметь модель представления:

public class MyViewModel
{
    public string Foo { get; set; }

    [RequiredIfPropertyIsEmpty("Foo")]
    public string SelectedItemId { get; set; }

    public IEnumerable<SelectListItem> Items {
        get
        {
            return new[] 
            {
                new SelectListItem { Value = "1", Text = "item 1" },
                new SelectListItem { Value = "2", Text = "item 2" },
                new SelectListItem { Value = "3", Text = "item 3" },
            };
        }
    }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

И, конечно, представление:

@model MyViewModel

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.Foo)
        @Html.EditorFor(x => x.Foo)
    </div>
    <div>
        @Html.LabelFor(x => x.SelectedItemId)
        @Html.DropDownListFor(x => x.SelectedItemId, Model.Items, "-- select an item --")
        @Html.ValidationMessageFor(x => x.SelectedItemId)
    </div>

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

или вы можете сделать, как я: скачать и использовать библиотеку FluentValidation.NET , забыть о аннотациях данных и написать следующую проверкулогика, которая кажется довольно очевидной:

public class MyViewModelValidator: AbstractValidator<MyViewModel> 
{
    public MyViewModelValidator() 
    {
        RuleFor(x => x.SelectedItemId)
            .NotEmpty()
            .When(x => !string.IsNullOrEmpty(x.Foo));
    }
}

Просто иди и Install-Package FluentValidation.MVC3 и сделай свою жизнь проще.

1 голос
/ 03 ноября 2011

Вы можете создать условный атрибут.

условная проверка ASP.net MVC

ASP.NET MVC Условная проверка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...