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>
}
154965 次浏览

在构造函数中设置:

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());
}

你要点什么?您最终可能会得到一个默认搜索和一个从某处加载的搜索。默认搜索需要一个缺省构造函数,所以像 Dismissile 已经建议的那样设置一个。

如果您从其他地方加载搜索条件,那么您可能需要一些映射逻辑。

使用以下构造函数代码为 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);
}
}
}
}

并在视图模型中继承这一点:

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

如果您需要将相同的模型发布到服务器,那么在构造函数中具有默认 bool值的解决方案对您来说是不可行的。让我们假设您有以下模型:

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


public SearchModel()
{
IsMale = true;
}
}

你会看到这样的东西:

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

问题在于,当用户取消选中此复选框并将其发送到服务器时——您最终将在构造函数中设置默认值(在本例中为 true)。

所以在这种情况下,我只需要在 view 中指定默认值:

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

使用特定值:

[Display(Name = "Date")]
public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6
<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 内核中的输入的默认值