在MVC Web应用程序中设置默认值

时间:2014-08-20 07:16:23

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

我正在尝试在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>

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

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

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

3 个答案:

答案 0 :(得分:8)

DefaultValue attribute并非用于根据需要在属性上设置默认值。实际上,它根本不是由运行时直接使用的。它的目的是供Visual Studio设计人员使用。

更多信息:

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

OR

.Net DefaultValueAttribute on Properties


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

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

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

答案 1 :(得分:3)

我建议您创建一个viewmodel类,并使用它来设置默认值,例如

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

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

    // Include other properties as required.
}

在你的控制器中,使用像这样的viewmodel:

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

我建议使用viewmodels,而不是将实际数据类传递给视图,因为这样可以更轻松地更改视图代码。您使用视图模型获得的额外灵活性也是一个优点,例如:使用数据类,比如Car,如果您还想在同一视图上显示来自另一个数据类(例如Driver)的数据,则会很难。通过使用名为&#34; VehicleDetailsViewModel&#34;的视图模型您可以使用&#34; DriverName&#34;,&#34; CarMake&#34;,&#34; CarModel&#34;等等。

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

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

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

我不确定Razor解析器是否实际上正在接收DefaultValue

答案 2 :(得分:0)

请尝试以下操作:

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