2016-11-10 61 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