2016-11-10 92 views
0

使用MVC5我已經添加了視圖邏輯來禁用基於模型中的值的數據輸入。邏輯運行後,它被現有的EditorTemplate邏輯覆蓋 - 該字段保持啓用狀態。我怎樣才能讓我的禁用邏輯工作?這種觀點的邏輯首先運行:如何防止重寫View邏輯的EditorTemplate邏輯?

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

然後衝突EditorTemplate代碼:

@model DateTime 

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

你們能不能看看你的DateTime編輯器中查看'ViewData'對象,並覆蓋HtmlAttributes如果它存在,通常會將其與'ViewData'字典中的值一起傳遞的對象? – Bwolfing

+0

我沒有使用ViewData。 – DeveloperDan

+0

我知道你現在不是,但當你傳遞一個對象作爲第二個參數給'@ Html.EditorFor()'時,這些值就存儲在頁面的ViewData對象中。換句話說,你可以在你的日期時間編輯器中使用'ViewData [「@ class」]'(你可能需要仔細檢查字典中的確切鍵是什麼),你可以用它來覆蓋你的普通'new {@class =「form-control datepicker」}' – Bwolfing

回答

1

當你打電話@Html.EditorFor(model => model.Property, attributesObj),你必須定義一個自定義編輯器視圖中,可以看到,對於功能的智能感知說, htmlAttributes對象也包含在視圖的ViewData中。換句話說,如果您在編輯器視圖中訪問ViewData屬性,則應該有權訪問您從@Html.EditorFor(model => model.OnHold.DateIssued, attributes);聲明中傳遞的屬性。這裏有一個簡單的例子:

// 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) 

在你的情況你EditorTemplate現在這個樣子:

@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

這工作!不過,我需要從@class中刪除@。我將嘗試編輯您的答案以將其刪除。我的if語句檢查ViewData.ContainsKey(「disabled」),然後重新應用禁用的屬性。非常感謝。 – DeveloperDan