【问题标题】:Set the default value in MVC web application在 MVC Web 应用程序中设置默认值
【发布时间】:2014-08-20 07:16:22
【问题描述】:

我正在尝试在 ASP.net MVC Web 应用程序中设置字段的默认值。

我首先使用数据库,所以我为元数据添加了一个部分类,如下所示:

[MetadataType(typeof(RadioRoutingMetadata))]
public partial class RadioRouting
{
}

public partial class RadioRoutingMetadata
{
    [DefaultValue("%")]
    public string Slot { get; set; }

    [Required(ErrorMessage = "This field is requied")]
    [DefaultValue(0)]
    public int BlockStart { get; set; }

    [Required(ErrorMessage = "This field is requied")]
    [DefaultValue(499)]
    public int BlockEnd { get; set; }

    [DefaultValue(-1)]
    public int FallBackBaseIdentifier { get; set; }
}

阅读后我看到[DefaultValue(T)] 在创建时没有将字段初始化为该值。但是 Html 辅助方法不看这个字段吗?

这是我的看法:

<p>
   @Html.LabelFor(model => model.Slot, htmlAttributes: new { @class = "control-label col-md-2" })
   <span class="field">
       @Html.EditorFor(model => model.Slot, new { htmlAttributes = new { @class = "form-control" } })
       @Html.ValidationMessageFor(model => model.Slot, "", new { @class = "text-danger" })
   </span>
</p>

<p>
    @Html.LabelFor(model => model.BlockStart, htmlAttributes: new { @class = "control-label col-md-2" })
    <span class="field">
        @Html.EditorFor(model => model.BlockStart, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.BlockStart, "", new { @class = "text-danger" })
    </span>
</p>

<p>
    @Html.LabelFor(model => model.BlockEnd, htmlAttributes: new { @class = "control-label col-md-2" })
    <span class="field">
        @Html.EditorFor(model => model.BlockEnd, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.BlockEnd, "", new { @class = "text-danger" })
    </span>
</p>

所以当我现在提供一个创建表单时,我希望这些默认值出现在表单中。

我是否必须在控制器中初始化模型对象,设置默认值,然后将其传递给创建视图,就像它是一个编辑视图一样?

如果是这样,我如何创建一个构造函数来初始化部分类中的所有默认值?

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-5 default-value


【解决方案1】:

DefaultValue attribute 不用于根据需要设置属性的默认值。事实上,它根本不被运行时直接使用。它旨在供 Visual Studio 设计器使用。

更多信息在这里:

http://support.microsoft.com/kb/311339

.Net DefaultValueAttribute on Properties


您可以轻松地将 MVC 中字段的默认值设置为:

 @Html.EditorFor(model => model.BlockEnd, new { htmlAttributes = new { @class = "form-control", @Value = "499" } })

现在使用上面的代码第一次加载表单时BlockEnd的初始值将是499

【讨论】:

  • 所以换句话说,我不应该真正使用它?
  • @Zapnologica...是的..为了满足您的要求,您必须做其他事情...
  • @Zapnologica..如果你想用一些默认值填写你的表单,那么上面的答案可以工作,或者你可以使用“@Value”html属性来设置默认值..
  • 谢谢,很高兴知道我会记住它。但是,我更喜欢更集中的解决方案,我只应用默认值 ONCE。但是,我确实有一些情况会派上用场。谢谢。希望辅助方法可以查看元数据属性并添加@Value
【解决方案2】:

我建议你创建一个视图模型类,并使用它来设置默认值,例如

public class ExampleViewModel
{
    public string Slot { get; set; }

    [Required(ErrorMessage = "This field is required")]
    public int BlockStart { get; set; }

    // Include other properties as required.
}

在您的控制器中,像这样使用视图模型:

public ActionResult Index()
{
    var viewModel = new ExampleViewModel();
    viewModel.Slot = "A default value";

    return View(viewModel);
}

[HttpPost]
public ActionResult Index(ExampleViewModel viewModel)
{
    // Do whatever you need to do with the values in viewModel e.g. save them to database.
}

查看您的视图代码,您似乎不必更改它,除了将它放在顶部

@model ExampleViewModel

我建议使用视图模型,而不是将实际的数据类传递给视图,因为这样可以更轻松地更改视图代码。此外,您从使用视图模型中获得的额外灵活性是一个加号,例如如果您还想在同一视图上显示来自另一个数据类(例如 Driver)的数据,则使用数据类(例如 Car)会变得很困难。通过使用名为“VehicleDetailsViewModel”的视图模型,您可以拥有诸如“DriverName”、“CarMake”、“CarModel”等属性。

编辑:啊,好的,所以你已经在使用视图模型了。在这种情况下,我建议你在 viewmodel 类的构造函数中设置默认值。

public ExampleViewModel()
{
    this.Slot = "Whatver";
    // etc.
}

我认为这比我之前在上面的操作方法中设置默认值的建议要好得多。但是您可以选择在哪里设置默认值,它不是一成不变的。

我不确定 DefaultValue 是否真的被 Razor 解析器拾取。

【讨论】:

  • 我现在正在使用 ViewModel,恰好我的 View 模型与我的数据库模型相同。
  • 我真的很喜欢最后一个例子,但我认为你忘记了括号。
【解决方案3】:

请试试这个:

public partial class RadioRoutingMetadata
{
    public string Slot { get; set; } = "%";

    [Required(ErrorMessage = "This field is requied")]
    public int BlockStart { get; set; } = 0;

    [Required(ErrorMessage = "This field is requied")]
    public int BlockEnd { get; set; } = 499;

    public int FallBackBaseIdentifier { get; set; } = -1;
}

【讨论】:

    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2019-06-23
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多