【问题标题】:How can I prevent EditorTemplate logic from overriding View logic?如何防止 EditorTemplate 逻辑覆盖视图逻辑?
【发布时间】:2017-03-24 13:34:00
【问题描述】:

使用 MVC5,我添加了视图逻辑来禁用基于模型中的值的数据输入。逻辑运行后,它会被现有的 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" })

【问题讨论】:

  • 您不能在 DateTime 编辑器视图中查看 ViewData 对象,并使用 ViewData 字典中的值(如果存在)覆盖您通常传递的 HtmlAttributes 对象吗?
  • 我没有使用 ViewData。
  • 我知道您目前不是,但是当您将对象作为第二个参数传递给@Html.EditorFor() 时,值将存储在页面的ViewData 对象中。换句话说,您可以在您的日期时间编辑器部分中执行ViewData["@class"](您可能需要仔细检查字典中的确切键是什么),您可以使用它来覆盖您的正常new { @class = "form-control datepicker" }
  • 这听起来像是一个解决方案,但我还没想好。更多代码会有所帮助。如果您能制定一个答案,将不胜感激。
  • 让我知道该答案是否需要更多解释

标签: c# asp.net-mvc razor asp.net-mvc-5 mvc-editor-templates


【解决方案1】:

当您调用@Html.EditorFor(model =&gt; model.Property, attributesObj) 并定义了自定义编辑器视图时,您可以看到该函数的智能感知表明htmlAttributes 对象也包含在视图的ViewData 中。换句话说,如果您在编辑器视图中访问ViewData 属性,您应该可以访问您从@Html.EditorFor(model =&gt; 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)

【讨论】:

  • 成功了!我需要从@class 中删除@。我将尝试编辑您的答案以删除它们。我的 if 语句检查 ViewData.ContainsKey("disabled") 然后重新应用禁用的属性。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多