2015-09-08 15 views
7

Sto costruendo una forma e devo continuare a utilizzare una linea condizionale per aggiungere un attributo readonly html:Come evitare i condizionali in linea ripetitive per la definizione di htmlAttributes Html.EditorFor()

@Html.LabelFor(model => model.EventDate) 
<div class="row"> 
    <div class="col-xs-3"> 
     @Html.EditorFor(model => model.EventDate, new 
     { 
      htmlAttributes = Model.IsEditorReadOnly ? 
       (object)new { @class = "form-control input-lg", @type = "date", @readonly = "readonly" } : 
       (object)new { @class = "form-control input-lg", @type = "date" } 
     }) 
    </div> 
</div> 
@Html.ValidationMessageFor(model => model.EventDate) 

Si puo' t utilizzare un valore condizionale solo per il valore della proprietà @readonly perché anche se è impostato su null, verrà reso disponibile al client come readonly="" e ciò è sufficiente per consentire a un browser di rendere tale campo di sola lettura.

Ci deve essere un modo migliore per farlo rispetto a un condizionale in linea per ogni elemento del modulo solo per aggiungere un singolo attributo, giusto?

+3

È possibile creare Possiedi un metodo di estensione HtmlHelper - dire '@ Html.ReadOnlyEditorFor (espressione, htmlAttributes, isReadonly = true)' in cui viene aggiunto l'attributo a seconda del valore della Parametro 'isReadonly' –

+0

@StephenMuecke come modifico l'oggetto htmlAttributes all'interno di quell'helper per aggiungere/rimuovere la proprietà' @ readonly'? – travis

+1

Refer [questa risposta] (http://stackoverflow.com/questions/30127866/create-checkboxfor-mvc-helper-with-title-attribute-from-model-description/30135407#30135407) per un esempio –

risposta

2

Grazie a Steven Muecke per tutta l'assistenza (dargli tutti i voti positivi sopra nei commenti e al suo linkedanswers). Ecco lo the solution.

Per un modello con questa proprietà:

[Display(Name = "Event Date")] 
[DataType(DataType.Date)] 
[DisplayFormat(DataFormatString = "{0:MM-dd-yyyy}", ApplyFormatInEditMode = true)] 
[Range(typeof(DateTime), "01-01-2010", "12-31-2030")] 
public DateTime? EventDate { get; set; } 

creare questa metodo di estensione:

public static IHtmlString ReadOnlyEditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object 
htmlAttributes = null, bool isReadOnly = false) 
{ 
    IDictionary<string, object> attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
    if (isReadOnly) 
    { 
     attributes.Add("readonly", "readonly"); 
    } 

    return html.EditorFor(expression, new { htmlAttributes = attributes }); 
} 

e poi utilizzarlo nella vista in questo modo:

@Html.ReadOnlyEditorFor(model => model.EventDate, 
    new { @class = "form-control input-lg", @type = "date" }, 
    Model.IsEditorReadOnly) 

E tutti i metadati della proprietà del modello verranno visualizzati per lo primo ins che è stato chiamato sulla pagina. L'HTML risultante sarà simile a questa:

<input class="form-control input-lg text-box single-line" data-val="true" data-val-date="The field Event Date must be a date." data-val-range="The field Event Date must be between 1/1/2010 12:00:00 AM and 12/31/2030 12:00:00 AM." data-val-range-max="12/31/2030 00:00:00" data-val-range-min="01/01/2010 00:00:00" id="EventDate" name="EventDate" type="date" value="08-01-2015" /> 
Problemi correlati