2015-08-29 4 views
6

I Gerüst verwendet Platzhalter-Text in HTML-Eingabe in einer gerüst Ansicht erhalten, die Ansichten und Controller für mich zu generieren, und ich bin mit dem EF Code erste Syntax.Wie mithilfe von Display (Eingabeaufforderung) Attributs über Modellklasse

Ich verstehe, dass T4-Vorlagen für die Implementierung der Attributwerte im generierten HTML/View-Code verantwortlich sind, aber ich sehe nicht die Standard-Gerüst-Vorlage mit VS 2015 community edition alles für Platzhalter Text.

pro meinem Verständnis ein Modell Eigenschaft mit [Display(Prompt="some placeholder text")] Attributen Ergebnissen in den some placeholder text auf der Dekoration wird als Platzhalter für das Texteingabefeld in der Erstellung/Bearbeitung von Ansichten angezeigt.

Aber zu meiner Bestürzung passiert das nicht.

Gibt es ein anderes Attribut? oder etwas anderes, was ich tun muss? oder ist es, weil ich Gerüste verwendet habe, um Ansichten zu generieren? Oder geht die Standard T4-Vorlage nicht besonders gut?

sieht mein Code für Modellklasse wie folgt:

public class Status 
{ 
    public int ID { get; set; } 

    [Required(ErrorMessage ="Status Name is needed!")] 
    [Display(Name ="Status Name",Prompt ="Type something here!")] 
    public string StatusName { get; set; } 
    [Required] 
    public string Description { get; set; } 
} 

Unterhalb der generierte Code Ansicht ist:

@model LunchFeedback.Models.Status 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 


@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Status</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.StatusName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.StatusName, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.StatusName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

Edit:

Ich bin mir sehr wohl bewusst, dass die direkte Bearbeitung Datei ansehen und einen Platzhalter hinzufügen, der dort arbeiten kann.

 @Html.EditorFor(model => model.StatusName, new { htmlAttributes = new { @class = "form-control", placeholder = "Type something here!" } }) 

Aber ich möchte alle Dinge aus dem Modell steuern und Gerüstbau verwenden wollen. Am besten bearbeiten Sie sogar die T4-Vorlage, um dies zu tun.

+1

Die Eigenschaft 'Prompt' von' DisplayAttribute' und der Wert für die Eigenschaft 'ModelMetadata.Watermark'. Wird nicht verwendet, um ein Attribut 'placeholder =" .. "in einer Eingabe zu erzeugen. –

+0

@StephenMuecke und die Standard-MVC-Vorlage verwendet beim Erstellen der Ansichten nicht die 'ModelMetadata.Watermark' -Eigenschaft? – DhruvJoshi

+1

Nein, tut es nicht. Aus [Brad Wilsons Blog] (http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.html) - _ "Text, der möglicherweise als Wasserzeichen angezeigt wird wenn Sie dieses Modell in einem Textfeld bearbeiten Standard: null "_. Es scheint vernünftig zu sein, diese Eigenschaft verwendet zu haben, um das 'Platzhalter'-Attribut zu erzeugen, aber ich nehme an, das MVC-Team will nur, dass es ein bisschen flexibler ist und es dem Entwickler überlassen, zu entscheiden, was damit zu tun ist eigene benutzerdefinierte 'EditorTemplates'). –

Antwort

5

Die Prompt Eigenschaft DisplayAttribute den Wert auf die WaterMark Eigenschaft der mit dem Eigentum verbundenen ModelMetadata hinzuzufügen. Es wird nicht zum Generieren des HTML-Attributs placeholder verwendet.

Sie möchten seinen Wert als placeholder Attribut verwenden, aber ein anderer Entwickler möchte vielleicht eine Tooltip generieren (mit dem Attribut title), so dass es den Entwickler überlassen, wie sie es verwenden möchten.

Die T4-Vorlagen für den Gerüstbau Bearbeitungsansicht erzeugen @Html.Editor() für Eigenschaften des Modells, so dass Sie Ihre eigenen EditorTemplates im /Views/Shared/EditorTemplates Ordner erstellen (oder /Views/youControllerName/EditorTemplates wenn Sie spezifischere Vorlagen wollen für einen bestimmten Controller verwendet werden)

Beachten Sie, dass die Methode EditorFor() zunächst in der Datei /Views/youControllerName/EditorTemplates nach einer Vorlage sucht.Wenn es einen nicht findet, sucht es dann in der /Views/Shared/EditorTemplates und wenn man nicht gefunden wird, dann wird die Vorgabe EditorTemplate

Zum Beispiel eine Vorlage für alle Eigenschaften zu verwenden, die typeof string sind, erstellen Sie eine Teilansicht benannt String.cshtml im EditorTemplates Ordner

@Html.TextBox("", ViewData.ModelMetadata.Model, new { placeholder = ViewData.ModelMetadata.Watermark }) 

oder die Verwendung dieser Vorlage begrenzen nur bestimmte Eigenschaften, die teilweise (sagen wir) PlaceHolder.cshtml nennen und dann die UIHintAttribute auf Ihrer Eigenschaft

[Display(Name ="Status Name", Prompt ="Type something here!")] 
[UIHint("PlaceHolder")] 
public string StatusName { get; set; } 
2

können Sie diese versuchen

public static class AppEditors 
{ 
    public static MvcHtmlString AppTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) 
    { 
     var member = expression.Body as MemberExpression; 
     var placeholder = member.Member 
           .GetCustomAttributes(typeof(Display), false) 
           .FirstOrDefault() as Display; 

     var attributes = (IDictionary<string, object>)newRouteValueDictionary(htmlAttributes) ?? new RouteValueDictionary(); 

     if (placeholder!= null) 
     { 
      attributes.Add("placeholder", placeholder.Prompt); 
     } 
     return htmlHelper.TextBoxFor(expression, attributes); 
    } 
} 

In View

@AppEditors.AppTextBoxFor(Html,x => x.StatusName) 
+0

Vielen Dank für Ihre Antwort. Das ist sehr hilfreich. Das Erstellen einer benutzerdefinierten Erweiterung für HTML-Helfer ist ebenfalls eine gute Idee, aber ich würde es vorziehen, meine Ansichten zu strukturieren und die Vorlagen zu nutzen. – DhruvJoshi

Verwandte Themen