デフォルトのエディター テンプレート (Object.ascx) をオーバーライドして、実行される Twitter Bootstrap のガイドライン ( http://twitter.github.io/bootstrap/base-css.html#forms ) に従うフォーム (本文) HTML を生成しました。 Html.EditorForModel() 経由。
@if (ViewData.TemplateInfo.TemplateDepth > 1)
{
@(Model == null ? ViewData.ModelMetadata.NullDisplayText : ViewData.ModelMetadata.SimpleDisplayText)
}
else
{
foreach (var property in ViewData.ModelMetadata.Properties.Where(m => m.ShowForEdit @*&& m.ModelType != typeof (System.Data.EntityState)*@ && !m.IsComplexType && !ViewData.TemplateInfo.Visited(m)))
{
if (property.HideSurroundingHtml)
{
@Html.Editor(property.PropertyName)
}
else
{
<div class="control-group @(!ViewData.ModelState.IsValidField(property.PropertyName) ? "error" : ViewData.ModelState.ContainsKey(property.PropertyName) ? "success" : "" )">
@if (!string.IsNullOrEmpty(Html.Label(property.PropertyName).ToHtmlString()))
{
@Html.Label(property.GetDisplayName() + (property.IsRequired ? " *" : ""), new { @class = "control-label" })
}
<div class="controls">
@Html.Editor(property.PropertyName)
@Html.ValidationMessage(property.PropertyName, "*", new { @class = "help-inline" })
</div>
</div>
}
}
}
フォームを微調整しない限り、これはうまく機能します (たとえば、順序を変更したり、フィールドセットを追加したりします)。私は基本的に、上記のコードの一部を別のエディター テンプレートに分離したいと考えています。その結果、Property.ascx が作成されました。これにより、特定のプロパティのラベル、入力、および検証メッセージがレンダリングされ、Html.Editor("{PropertyName"}) または Html.EditorFor(m => m.{PropertyName}) を介して実行されます。
<div class="control-group @(!ViewData.ModelState.IsValidField(ViewData.ModelMetadata.PropertyName) ? "error" : ViewData.ModelState.ContainsKey(ViewData.ModelMetadata.PropertyName) ? "success" : "" )">
@if (!string.IsNullOrEmpty(Html.Label(ViewData.ModelMetadata.PropertyName).ToHtmlString()))
{
@Html.Label(ViewData.ModelMetadata.GetDisplayName() + (ViewData.ModelMetadata.IsRequired ? " *" : ""), new { @class = "control-label" })
}
<div class="controls">
@Html.Editor(ViewData.ModelMetadata.PropertyName)
@Html.ValidationMessage(ViewData.ModelMetadata.PropertyName, "*", new { @class = "help-inline" })
</div>
</div>
上記のエディタ テンプレートの問題は、指定されたタイプの正しい入力をレンダリングしないことです。したがって、日付/時刻プロパティは、type 属性のない通常のテキスト ボックスをレンダリングするだけです。
私はこれを正しい方法で行っていますか?標準の HTML ヘルパーまたは部分ビューを使用する必要がありますか? もしそうなら、ジェネリックな性質をどのように扱うのでしょうか?