如何避免ascx模板覆盖原始样式,类,maxlength等属性?

时间:2011-02-27 19:04:23

标签: asp.net-mvc

主要问题:在MVC2解决方案/项目中添加所有(!)文本框js / jquery方法。
基础知识:如何调用ascx模板?
Solved, see here
(感谢Darin Dimitrov!)

BUT ...

表示将调用ascx模板“Test.ascx”,如下所示:

<%: Html.EditorFor(model => model.Firstname, "Test", new { style = "float: left; width: 4.1em;", maxlength = "4" })%>

“Test.ascx”模板添加了js / jquery函数 工作正常,np如此票价 但是:“原始”属性style="..." maxlength="..."将被丢失/覆盖。

我当前的解决方案/我的“Test.ascx”文件:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<input type="text" 
         id="<%: ViewData.TemplateInfo.GetFullHtmlFieldId(string.Empty) %>"
       name="<%: ViewData.TemplateInfo.HtmlFieldPrefix %>"
      value="<%: ViewData.TemplateInfo.FormattedModelValue %>" 
      style="<%: ViewData["style"] %>"
      class="<%: ViewData["class"] %>"
  maxlength="<%: ViewData["maxlength"] %>"
    onkeyup="Foo(this); return false;"/>

这种方法非常好,并且可以完美地返回/渲染它:

<input type="text" 
         id="Firstname"
       name="Firstname"
      value="" 
      style="float: left; width: 4.1em;"
      class=""
  maxlength="4"
    onkeyup="Foo(this); return false;"/>

请注意,style="..."maxlength="..."属性处理得很好! 我目前使用“标准”< input ... />标记,因为我没有让它工作:

<%
    String tmpConfig = " new {onkeyup=\"Foo(this); return false;\"";

    String style = this.ViewData["style"] as String;
    if (!String.IsNullOrEmpty(style))
        tmpConfig += ", style=\"" + style + "\"";

    String @class = this.ViewData["class"] as String;
    if (!String.IsNullOrEmpty(@class))
        tmpConfig += ", class=\"" + @class + "\"";

    String maxlength = this.ViewData["maxlength"] as String;
    if (!String.IsNullOrEmpty(maxlength))
        tmpConfig += ", maxlength=\"" + maxlength + "\"";

    tmpConfig += " } ";
%>

<!-- doesnt work: -->
<%: Html.TextBox(   string.Empty,
                    ViewData.TemplateInfo.FormattedModelValue,
                    // new { onkeyup = "Foo(this); return false;" }    // the style, class, maxlength attributes will be lost / not rendered!
                    // new { tmpConfig }    // result would be the attribut: tempConfig=" onkeyup..."
                    // new tmpConfig        // result: error, tmpConfig isnt object
                    Html.Encode(tmpConfig)  // doesnt work ...
                )%>

这最终呈现相同但没有style="..."maxlength="..."属性!

但我想使用<%: Html.TextBox(...) %>代替< input ... />代码!
因为这样我就可以避免出现像class=""这样的空属性。

我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

您必须为Html.TextBox提供String,Object字典以保存所有属性

    <%
    var dict = new Dictionary<string, object>();

    String style = this.ViewData["style"] as String;
    if (!String.IsNullOrEmpty(style))
        dict.Add("style", style);

    String @class = this.ViewData["class"] as String;
    if (!String.IsNullOrEmpty(@class))
        dict.Add("class", @class);

    String maxlength = this.ViewData["maxlength"] as String;
    if (!String.IsNullOrEmpty(maxlength))
        dict.Add("maxlength", maxlength);

    dict.Add("onkeyup", "Foo(this); return false;");
%>

<%: Html.TextBox(   string.Empty,
                    ViewData.TemplateInfo.FormattedModelValue,
                    dict
                )%>