2015-09-08 13 views
7

buduję formę i muszę zachować przy użyciu inline warunkowego dodać atrybut readonly HTML:Jak uniknąć powtarzających inline warunkowe definiowania htmlAttributes z 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) 

można” t używaj warunku tylko dla wartości właściwości @readonly, ponieważ nawet jeśli ustawiona jest na wartość null, zostanie ona wyrenderowana do klienta jako readonly="" i to wystarczy, aby przeglądarka wykonała to pole tylko do odczytu.

Musi istnieć lepszy sposób na zrobienie tego niż wbudowane warunkowe dla każdego elementu formularza, aby dodać pojedynczy atrybut, prawda?

+3

Można tworzyć własne metody rozszerzenie HtmlHelper - mówią '@ Html.ReadOnlyEditorFor (wyrażenie, htmlAttributes, IsReadOnly = true)' gdzie atrybut jest dodawany w zależności od wartości danej Parametr 'isReadonly' o nazwie –

+0

@StephenMuecke jak zmodyfikować obiekt htmlAttributes w tym pomocniku, aby dodać/usunąć właściwość' @ readonly'? – travis

+1

Zobacz [tę odpowiedź] (http://stackoverflow.com/questions/30127866/create-checkboxfor-mvc-helper-with-title-attribute-od-ododruk-modelu/30135407#30135407) na przykład –

Odpowiedz

2

Dzięki Steven Muecke za całą pomoc (przekaż mu wszystkie swoje up-votes powyżej w komentarzach i na jego linkedanswers). Oto the solution.

Dla modelu z tej właściwości:

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

utworzyć tę metodę rozszerzenia:

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

a następnie używać go w widoku jak ten:

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

i wszyscy dane meta właściwości modelu zostaną wyświetlone dla najpierw ins na tej stronie. Powstały html będzie wyglądać następująco:

<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" /> 
Powiązane problemy