6

Przesłoniłem domyślny szablon edytora (Object.ascx), aby wygenerować kod HTML (postaci), który następuje po wytycznych programu Twitter Bootstrap (http://twitter.github.io/bootstrap/base-css.html#forms), który jest wykonywany przez Html.EditorForModel().Używanie edytoraDo usługi Twitter Bootstrap w celu renderowania etykiety formularza, wprowadzania i sprawdzania poprawności wiadomości

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

Działa to dobrze, chyba że chcę zmodyfikować formularz (np. Zmienić porządek lub dodać zestawy pól). Zasadniczo chcę oddzielić część powyższego kodu na inny szablon edytora, co zaowocowało rozwiązaniem Property.ascx. Spowoduje to renderowanie etykiety, danych wejściowych i komunikatu sprawdzania poprawności dla danej właściwości, wykonywanego przez Html.Editor ("{NazwaUwagi}}) lub Html.EditorFor (m => m. {Nazwa_właściwości}).

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

Problem z powyższym szablonem edytora polega na tym, że nie wyświetla poprawnych danych wejściowych dla danego typu. Tak więc właściwość date/time wyrenderuje zwykłe pole tekstowe bez atrybutu type.

Czy podążam tą właściwą drogą? Czy powinienem używać standardowego pomocnika HTML lub widoku częściowego? Jeśli tak, to jak sobie poradzimy z ogólną naturą?

Odpowiedz

4

MVC 5.1 zawiera poprawkę dla dokładnie tego przypadku, Bootstrap support for editor templates. Możesz dołączyć dodatkowe właściwości znaczników przez dostarczanie anonmyous obiekt jako drugi parametr EditorFor

@Html.EditorFor(model => model, new { htmlAttributes = new { @class = "form-control" }, }) 
+0

jak u można utworzyć templateeditor że łączy htmlAttributes? –

Powiązane problemy