我有这个模型:
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>
}
在构造函数中设置:
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());
}
使用特定值:
[Display(Name = "Date")]
public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6
使用以下构造函数代码为您的 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; }
}
public bool IsMale { get; set; } = true
如果您需要发布相同的模型以在构造函数中具有默认 bool
值的解决方案对您来说不可行。假设您有以下模型:
public class SearchModel
{
public bool IsMale { get; set; }
public SearchModel()
{
IsMale = true;
}
}
在视图中你会有这样的东西:
@Html.CheckBoxFor(n => n.IsMale)
问题是当用户取消选中此复选框并将其发布到服务器时 - 您最终会在构造函数中设置默认值(在这种情况下为 true)。
所以在这种情况下,我最终只会在视图上指定默认值:
@Html.CheckBoxFor(n => n.IsMale, new { @checked = "checked" })
<div class="form-group">
<label asp-for="Password"></label>
<input asp-for="Password" value="Pass@123" readonly class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
使用 : value="Pass@123" 作为 .net 核心输入中的默认值
你会有什么?您可能最终会得到一个默认搜索和一个从某处加载的搜索。默认搜索需要一个默认构造函数,所以像 Dismissile 已经建议的那样做一个。
如果您从其他地方加载搜索条件,那么您可能应该有一些映射逻辑。