2015-09-08 18 views
7

bir form inşa ediyorum ait htmlAttributes tanımlamak için tekrarlayıcı satır içi conditionals önlemek yapmak ve bir readonly html öznitelik eklemek için koşullu bir satır içinde kullanırken tutmak zorunda:nasıl 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) 

yapabilirsiniz' t @readonly özelliğinin değeri için koşullu kullanın çünkü null değerine ayarlanmış olsa bile, istemciye readonly="" olarak verilir ve bu, bir tarayıcı için bu alanı salt okunur yapmak için yeterlidir.

Bunu yapmak için her satır öğesinin satır içi koşulundan daha iyi bir yolu olması gerekir, yalnızca tek bir özellik eklemek için değil mi?

+3

Sen HtmlHelper uzantısı yöntemini kendi oluşturabilir - söylemek '@ Html.ReadOnlyEditorFor (anlatım, htmlAttributes, IsReadOnly = true)' nitelik değerine bağlı olarak ilave edilir nerede '@Readonly' parametresi –

+0

@StephenMuecke' @ readonly' özelliğini eklemek/kaldırmak için bu yardımcıdaki htmlAttributes nesnesini nasıl değiştirebilirim? – travis

+1

Bir örnek için [bu yanıt] konusuna bakın (http://stackoverflow.com/questions/30127866/create-checkboxfor-mvc-helper-with-title-attribute-from-model-description/30135407#30135407) –

cevap

2

Yardım için Steven Muecke numaralı telefona teşekkür ederiz. (Ona yukarıdaki tüm oylamaları yukarıdaki yorumlar ve linked numaralı telefondan answers numaralı telefondan verebilirsiniz). İşte the solution.

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

bu uzantı yöntemi oluşturun:

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

Ve sonra böyle görünümünde kullanın:

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

Ve tüm bu özelliğe sahip bir model için

modelin meta verileri ilk ins için görünür. Sayfada denir. Ortaya çıkan html aşağıdaki gibi görünecektir:

<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" /> 
İlgili konular