Значение по умолчанию в модели представления asp.net mvc - PullRequest
63 голосов
/ 03 октября 2011

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

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>
}

Ответы [ 6 ]

119 голосов
/ 03 октября 2011

Установите это в конструкторе:

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());
}
15 голосов
/ 31 мая 2012

Создайте базовый класс для вашего 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; }
}
11 голосов
/ 26 июня 2017

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

[Display(Name = "Date")]
public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6
1 голос
/ 03 июля 2015

В случае, если вам нужно отправить ту же модель на сервер, решение со значением по умолчанию 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" })
0 голосов
/ 18 января 2018

Просто хотел отметить комментарий @ Dismissile, поскольку я не могу ни отредактировать его ответ, ни добавить комментарий к нему, чтобы указать, что вызов конструктора View new приведет к ошибке (протестировано в Visual Studio 2015), это имеет смысл, поскольку мы просто создаем экземпляр модели, а не класса View. Правильная строка кода будет:

return View(new SearchModel());
0 голосов
/ 03 октября 2011

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

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

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