我正在尝试在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对象,设置默认值,然后将其传递给创建视图,就好像它是编辑视图一样?
如果是这样,我如何创建一个初始化分部类中所有默认值的构造函数?
答案 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;
}