Значение по умолчанию в поле 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>
}
6 ответов:
установите это в конструкторе:
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()); }
создайте базовый класс для вашего
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; } }
использовать определенное значение:
[Display(Name = "Date")] public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6
Что вы будете есть? Вероятно, вы получите поиск по умолчанию и поиск, который вы загружаете откуда-то. Поиск по умолчанию требуется конструктор по умолчанию, так как один освобождающий лук уже предложил.
Если вы загружаете критерии поиска из другого места, то вы, вероятно, должны иметь некоторую логику отображения.
в случае, если вам нужно разместить ту же модель на сервере решение с наличием по умолчанию
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" })
просто хотел отметить ответ @Dismissile, так как я не могу отредактировать его ответ или добавить комментарий к нему, чтобы указать, что вызов конструктора представления
newприведет к ошибке (проверено в Visual Studio 2015), что имеет смысл, поскольку мы просто создаем экземпляр модели, а не класса представления. Правильная строка кода будет:return View(new SearchModel());
Comments