Выберите между DropDownList и Textbox в MVC3 - PullRequest
1 голос
/ 19 марта 2012

У меня есть View с формой, где я хочу DropDownList, который отображает категории с опцией, где пользователь может добавить новую категорию в текстовое поле:

<div class="editor-field">
        @Html.DropDownListFor(model => model.Category_ID, (SelectList) ViewBag.CatIDs, "- Select a Category -")
        or add a new category
        @Html.TextBox("NewCategory")
        @Html.ActionLink("New Category", "AddCategory", null, new { id = "add" })
    </div>

Если в текстовое поле вводится новая категория, а не выбирается из ddl, проверка жалуется на отсутствие выбора. Есть ли способ отключить это в случае, если текстовое поле не пустое?

Другой вариант, который я рассмотрел, - это кнопка для добавления новой категории, которая должна добавить новую запись в базу данных и обновить выпадающий список. Но это опубликует всю форму (и приведет к проверке всех других полей на странице). Есть ли способ разместить только часть формы для одной кнопки и всю форму для другой?

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Я полагаю, что ваша модель представления сейчас выглядит примерно так:

public class MyViewModel
{
    [Required(ErrorMessage = "Please select a category")]
    public int? Category_ID { get; set; }

    public string NewCategory { get; set; }
}

Одна из возможностей - написать собственный атрибут проверки:

[AttributeUsage(AttributeTargets.Property)]
public class RequiredIfOtherPropertyIsNull : ValidationAttribute
{
    private readonly string _otherProperty;
    public RequiredIfOtherPropertyIsNull(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(
                    CultureInfo.CurrentCulture, 
                    "Could not find a property named {0}", 
                    _otherProperty
                )
            );
        }
        var otherValue = property.GetValue(validationContext.ObjectInstance, null);
        if (otherValue == null && value == null)
        {
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        }

        return null;
    }
}

, а затем:

public class MyViewModel
{
    [RequiredIfOtherPropertyIsNull("NewCategory", ErrorMessage = "Please select a category")]
    public int? Category_ID { get; set; }

    public string NewCategory { get; set; }
}

Другой, и ИМХО, гораздо лучший способ - использовать FluentValidation.NET вместо DataAnnotations для проверки. прекрасно интегрируется с ASP.NET MVC и делает такие сценарии проверки простыми.

0 голосов
/ 19 марта 2012

Вы даже можете заставить ddl действовать как TextBox, когда хотите вставить новое значение

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