2015-08-29 8 views
6

ho usato ponteggi per generare i punti di vista e controller per me e sto usando il codice EF prima sintassi.Come arrivare testo segnaposto in input HTML in una vista ponteggi utilizzando display attributo (prompt) oltre la classe del modello

Capisco che i modelli T4 sono responsabili dell'implementazione dei valori degli attributi nel codice HTML/vista generato, ma non vedo il modello di scaffold predefinito disponibile con VS 2015 community edition che fa qualcosa per il testo segnaposto.

Per la mia comprensione su di decorare una proprietà modello con [Display(Prompt="some placeholder text")] risultati degli attributi nel some placeholder text visualizzato come segnaposto per la casella di testo di input nelle creare/modificare vista.

Ma con mio sgomento, questo non succede.

C'è qualche altro attributo? o qualcos'altro che devo fare? o perché ho usato scaffolding per generare viste? o il modello T4 predefinito non sta facendo il suo lavoro molto bene?

Il mio codice per la classe del modello si presenta come di seguito:

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

Di seguito si riporta il codice vista generato:

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

Sono ben consapevole che modificando direttamente il visualizzare il file e aggiungere un segnaposto lì può fare il lavoro.

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

Ma voglio controllare tutte le cose dal modello e voglio usare scaffolding. Preferibilmente anche modificare/personalizzare il modello T4 per farlo.

+1

La proprietà 'Prompt' di' DisplayAttribute' e il valore della proprietà 'ModelMetadata.Watermark'. Se non viene utilizzato per generare un attributo 'placeholder =" .. "' in un input. –

+0

@StephenMuecke e il modello MVC predefinito non utilizzano la proprietà 'ModelMetadata.Watermark' quando si creano le viste? – DhruvJoshi

+1

No, non lo è. Dal [blog di Brad Wilson] (http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.html) - _ "Testo che potrebbe essere visualizzato come filigrana quando si modifica questo modello in una casella di testo. Predefinito: null "_. Sembrerebbe ragionevole aver usato questa proprietà per generare l'attributo 'placeholder', ma presumo che il team MVC voglia solo che sia un po 'più flessibile e lasci allo sviluppatore decidere cosa fare con esso (cioè quando crei il tuo proprio personalizzato 'EditorTemplates'). –

risposta

5

La Prompt proprietà del DisplayAttribute aggiungere il valore alla WaterMark proprietà del ModelMetadata associato alla proprietà. Non viene utilizzato per la generazione dell'attributo html placeholder.

Si desidera utilizzare il suo valore come attributo ma un altro sviluppatore potrebbe voler utilizzare per generare un suggerimento (utilizzando l'attributo title) in modo che sia lasciato allo sviluppatore come utilizzarlo.

I modelli T4 per ponteggi modificare vista generare @Html.Editor() per le proprietà del modello in modo da poter creare il proprio EditorTemplates nella cartella /Views/Shared/EditorTemplates (o /Views/youControllerName/EditorTemplates se volete i modelli più specifici da utilizzare per un particolare controller)

Si noti che il metodo EditorFor() cerca innanzitutto un modello nello /Views/youControllerName/EditorTemplates.Se non trova uno, cerca poi nel /Views/Shared/EditorTemplates e se uno non viene trovato, allora utilizza il valore predefinito EditorTemplate

Ad esempio, per utilizzare un modello per tutte le proprietà che sono typeof string, creare una vista parziale di nome String.cshtml nella cartella EditorTemplates

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

o di limitare l'uso di questo modello per solo alcune proprietà, il nome del parziale (diciamo) PlaceHolder.cshtml e quindi utilizzare il UIHintAttribute sulla vostra proprietà

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

Si può provare questo

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 vista

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

Grazie per la risposta. Questo è veramente utile. Anche la creazione di un'estensione personalizzata per gli helper HTML è una buona idea, ma preferirei impalcettare le mie visualizzazioni e vorrei sfruttare i modelli. – DhruvJoshi

Problemi correlati