在asp.net mvc视图模型中的默认值

我有这个模型:

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

但基于我的研究和答案在这里, DefaultValueAttribute实际上并没有设置一个默认值。 但是这些答案是从2008年开始的,当传递给视图时,是否有一个属性或更好的方法比使用私有字段将这些值设置为true?

不pipe怎么说,

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

在构造函数中设置它:

 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创build一个基类,这将在创build任何inheritance模型时应用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); } } } } 

并从您的ViewModelsinheritance:

 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 

你会有什么? 您可能最终会从某处加载默认search和search。 默认search需要一个默认的构造函数,所以build立一个像Dismissile一样。

如果你从其他地方加载search标准,那么你应该有一些映射逻辑。

如果您需要将相同的模型发布到服务器,那么在构造函数中具有默认bool值的解决scheme将不适合您。 假设你有以下模型:

 public class SearchModel { public bool IsMale { get; set; } public SearchModel() { IsMale = true; } } 

鉴于你会有这样的事情:

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

问题是,当用户取消选中此checkbox并将其发布到服务器 – 您将最终在构造函数中设置默认值(在这种情况下是真实的)。

所以在这种情况下,我最终只是在视图上指定默认值:

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