2016-11-10 5 views
0

Mit MVC5 habe ich View-Logik hinzugefügt, um die Dateneingabe basierend auf einem Wert im Modell zu deaktivieren. Nachdem die Logik ausgeführt wurde, wird sie von der vorhandenen EditorTemplate-Logik überschrieben - das Feld bleibt aktiviert. Wie kann ich meine Sperrlogik funktionieren lassen? Diese Ansicht Logik läuft zuerst:Wie kann ich verhindern, dass die EditorTemplate-Logik die View-Logik überschreibt?

<div> 
    @{ 
     object attributes = new { @class = "form-control", @disabled = "disabled", @readonly = "readonly" }; 

     if (Model.OnHold.Number == 0) { 
      attributes = new { @class = "form-control datePicker" }; 
     } 

     @Html.EditorFor(model => model.OnHold.DateIssued, attributes); 
    } 
</div> 

die in Konflikt stehenden EditorTemplate Code:

@model DateTime 

@Html.TextBox(string.Empty, @Model.ToString("MM/dd/yyyy"), new { @class = "form-control datepicker" }) 
+0

kann nicht man sich das 'ViewData' Objekt in Ihrer Editor Datetime-Ansicht, und überschreibt die Htmlattributes Objekt übergeben Sie normalerweise mit dem Wert im 'ViewData' Dictionary, wenn es vorhanden ist? – Bwolfing

+0

Ich verwende ViewData nicht. – DeveloperDan

+0

Ich weiß, dass Sie derzeit nicht sind, aber wenn Sie ein Objekt als zweiten Parameter an '@ Html.EditorFor()' übergeben, werden die Werte im Objekt 'ViewData' der Seite gespeichert. Mit anderen Worten, Sie können 'ViewData ["@ class"] '(Sie müssen möglicherweise überprüfen, was der genaue Schlüssel im Wörterbuch ist) in Ihrem datetime-Editor teilweise überprüfen, und Sie könnten das verwenden, um Ihre normale' new zu überschreiben {@class = "form-control datepicker"} ' – Bwolfing

Antwort

1

Wenn Sie @Html.EditorFor(model => model.Property, attributesObj) anrufen und Sie haben einen benutzerdefinierten Editor Ansicht definiert, können Sie sehen, dass die Intellisense für die Funktion sagt, dass Das htmlAttributes-Objekt ist auch in der ViewData der Ansicht enthalten. Mit anderen Worten, wenn Sie auf die ViewData -Eigenschaft in Ihrer Editor-Ansicht zugreifen, sollten Sie Zugriff auf die Eigenschaften haben, die Sie von Ihrer @Html.EditorFor(model => model.OnHold.DateIssued, attributes);-Anweisung übergeben. Hier ist ein einfaches Beispiel:

// Index.cshtml - assuming model.Message is of type string 
@Html.EditorFor(model => model.Message, new { @class = "text-danger" }) 

// EditorTemplates/String.cshtml 
@model string 
@{ 
    object textboxAttributes = new { @class = "text-success" }; 
    // Override the default @class if ViewData property contains that key 
    if (ViewData.ContainsKey("class") && string.IsNotNullOrWhitespace(ViewData["class"].ToString()) 
    { 
     textboxAttributes = new { @class = ViewData["class"] }; 
    } 
} 

@Html.TextboxFor(model => model, textboxAttributes) 

In Ihrem Fall Ihre EditorTemplate nun wie folgt aussehen:

@model DateTime 

@{ 
    object dateAttributes = new { @class = "form-control datepicker" }; 

    if (ViewData.ContainsKey("disabled") && !String.IsNullOrWhiteSpace(ViewData["class"].ToString())) 
    { 
     dateAttributes = new { @class = ViewData["class"], @readonly = "readonly", @disabled = "disabled" }; 
    } 
} 

@Html.TextBox(string.Empty, @Model.ToString("MM/dd/yyyy"), dateAttributes) 
+1

Das hat funktioniert! Ich musste @ aus @class entfernen. Ich werde versuchen, Ihre Antwort zu bearbeiten, um sie zu entfernen. Meine if-Anweisung prüft auf ViewData.ContainsKey ("disabled") und wendet dann die deaktivierten Attribute erneut an. Danke vielmals. – DeveloperDan

Verwandte Themen