Подтвердить что ты не робот

Значение по умолчанию в модели просмотра asp.net mvc

У меня есть эта модель:

public class SearchModel
{
    [DefaultValue(true)]
    public bool IsMale { get; set; }
    [DefaultValue(true)]
    public bool IsFemale { get; set; }
}

Но на основании моих исследований и ответов здесь DefaultValueAttribute фактически не устанавливает значение по умолчанию. Но эти ответы были с 2008 года. Есть ли атрибут или лучший способ, чем использование частного поля для установки этих значений в true при передаче в представление?

В любом случае, это выглядит так:

@using (Html.BeginForm("Search", "Users", FormMethod.Get))
{
<div>
    @Html.LabelFor(m => Model.IsMale)
    @Html.CheckBoxFor(m => Model.IsMale)
    <input type="submit" value="search"/>
</div>
}
4b9b3361

Ответ 1

Задайте это в конструкторе:

public class SearchModel
{
    public bool IsMale { get; set; }
    public bool IsFemale { get; set; }

    public SearchModel()
    { 
        IsMale = true;
        IsFemale = true;
    }
}

Затем перейдите к представлению в действии GET:

[HttpGet]
public ActionResult Search()
{
    return new View(new SearchModel());
}

Ответ 2

Создайте базовый класс для ViewModels со следующим кодом конструктора, который будет применять DefaultValueAttributes при создании любой наследующей модели.

public abstract class BaseViewModel
{
    protected BaseViewModel()
    {
        // apply any DefaultValueAttribute settings to their properties
        var propertyInfos = this.GetType().GetProperties();
        foreach (var propertyInfo in propertyInfos)
        {
            var attributes = propertyInfo.GetCustomAttributes(typeof(DefaultValueAttribute), true);
            if (attributes.Any())
            {
                var attribute = (DefaultValueAttribute) attributes[0];
                propertyInfo.SetValue(this, attribute.Value, null);
            }
        }
    }
}

И наследуйте это в своих моделях ViewModels:

public class SearchModel : BaseViewModel
{
    [DefaultValue(true)]
    public bool IsMale { get; set; }
    [DefaultValue(true)]
    public bool IsFemale { get; set; }
}

Ответ 3

Используйте определенное значение:

[Display(Name = "Date")]
public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6

Ответ 4

Что у вас будет? Вероятно, вы в конечном итоге получите поиск по умолчанию и поиск, который вы загружаете где-то. Поиск по умолчанию требует конструктора по умолчанию, поэтому сделать так, как Dismissile уже предложил.

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

Ответ 5

Если вам нужно отправить ту же модель на сервер, решение с наличием значения по умолчанию bool в конструкторе не будет для вас жизнеспособным. Представьте себе, что у вас есть следующая модель:

public class SearchModel
{
    public bool IsMale { get; set; }

    public SearchModel()
    { 
        IsMale = true;
    }
}

В представлении у вас будет что-то вроде этого:

@Html.CheckBoxFor(n => n.IsMale)

Проблема заключается в том, что пользователь отключает этот флажок и отправляет его на сервер - вы получите значение по умолчанию, установленное в конструкторе (которое в этом случае истинно).

Итак, в этом случае я бы просто указал значение по умолчанию для представления:

@Html.CheckBoxFor(n => n.IsMale, new { @checked = "checked" })