我的控制器中有两个操作,创建和编辑,基本上使用相同的视图,因为添加和编辑记录的功能是相同的。
所以在我看来,我有这个:
@using (Html.BeginForm("Create", "Customers", FormMethod.Post, new { @class = "form-horizontal" }))
我可以使用@using (Html.BeginForm()) { }
但是那样的话,我看不到任何重载方法可以添加到我的css类文件中
如何在不必硬编码的情况下,将相同的BeginForm帮助程序用于创建和编辑操作?
或者,如果我想为我的表单标记设置一个样式,应该采用其他什么方法或最佳实践,该样式将用于两个不同的操作。
我和您做了同样的事情,两个操作都有一个视图。在控制器中,我只传递一个名为Action的ViewBag属性,该属性是根据上下文设置的。在视图中,只需调用@Html.BeginForm(ViewBag.Action,…).
最好的选择是创建一个css文件并将其包含在视图布局中。
<link href="**.css" rel="stylesheet" type="text/css" />
内部css:
form {
background-color: #fff;
margin: 0;
padding: 0;
}
尽管这似乎是一个为两者重用同一视图的好主意,但我可以告诉您,最终您将不得不将它们拆分,通常是由于请求了一些仅适用于其中一个或另一个的新功能。在实践中为"编辑"one_answers"创建"都设置一个专用视图是个好主意。在这和保持它们干燥之间,一个很好的折衷方案是让视图包含开始形式标记,如果需要的话,可能是一些JavaScript或任何其他引用,但对于字段本身,请使用@Html.EditorFor()并为该数据类型创建EditorTemplate。这样,它仍然尽可能地保持DRY原则,但仍然让你坚持单一责任原则。当然,如果它们变得更加复杂,那么共享的EditorTemplate可能也需要更改,在这种情况下,您可能需要在未来将其拆分,并使用类似@Html.EditorFor(x=>x, "CustomerEdit")
的东西
通常,让视图的关注点(生成表单URL)由控制器指定是一种糟糕的做法。
视图/客户/Create.cshtml
@using (Html.BeginForm("Create", "Customers", FormMethod.Post, new { @class = "form-horizontal" }))
{
@Html.EditorFor(x=>x)
}
视图/客户/编辑.cshtml
@using (Html.BeginForm("Edit", "Customers", FormMethod.Post, new { @class = "form-horizontal" }))
{
@Html.EditorFor(x=>x)
}
视图/客户/编辑模板/Customer.chtml
<div class="control-group">
<label class="control-label">@Html.DisplayNameFor(model => model.Name)</label>
<div class="controls">
<span class="text">
@Html.EditorFor(model => model.Name)
</span>
</div>
</div>
<div class="control-group">
<label class="control-label">@Html.DisplayNameFor(model => model.PhoneNumber)</label>
<div class="controls">
<span class="text">
@Html.EditorFor(model => model.PhoneNumber)
</span>
</div>
</div>
...etc