ChatGPT解决这个技术问题 Extra ChatGPT

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

D
Dismissile

在构造函数中设置:

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

这也会将值初始化为您在数据库中设置的值吗?还是仅仅在对象中?
@Zapnologica 这被写成一个 ViewModel,它独立于数据支持的模型而存在。在实践中,您可以创建 ViewModel,并使用从数据库条目中提取的值(使用数据支持的模型)覆盖这些默认值,但按原样,这将始终使用这些默认值。现在,当浏览器将其作为已发布表单的一部分提交时,您如何处理该数据(是否保存到数据库或其他)取决于您。
如果我用两个参数重载构造函数并在控制器中设置默认属性,这可以工作吗?
@Celdor我使用了这个,但是用一个对象作为参数重载了构造函数,在控制器中设置了这个对象,就像一个魅力。 ViewModel 的值设置为我给构造函数的对象的值。 (我猜使用 2 个参数差别不大)
G
Guruprakash

使用特定值:

[Display(Name = "Date")]
public DateTime EntryDate {get; set;} = DateTime.Now;//by C# v6

奇怪的是我不能在带有 C# 8 的 Asp.net core 3.1 中使用它。它不会引发错误,但也不起作用
C
CodeGrue

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

虽然这是一个聪明的解决方案,但我建议使用 C#6,最好(性能更高)使用这样的自动属性初始化器:public bool IsMale { get; set; } = true
O
Oleksii Aza

如果您需要发布相同的模型以在构造函数中具有默认 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" })

u
user14006190
<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 已经建议的那样做一个。

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