代码之家  ›  专栏  ›  技术社区  ›  Sergej Andrejev

防止ASP.NET生成somevalidator.display=“dynamic”;

  •  4
  • Sergej Andrejev  · 技术社区  · 15 年前

    我的ASP.NET页面动态显示207个问题(我无法控制)。每个问题有10个验证器。当ASP呈现页面时,它为每个验证器创建以下三行:

    var qsnQuestionSet_adult_qcQuestion_1_vldMaxAnswersValidator = document.all ? document.all["qsnQuestionSet_adult_qcQuestion_1_vldMaxAnswersValidator"] : document.getElementById("qsnQuestionSet_adult_qcQuestion_1_vldMaxAnswersValidator");
    qsnQuestionSet_adult_qcQuestion_1_vldMaxAnswersValidator.display = "Dynamic";
    qsnQuestionSet_adult_qcQuestion_1_vldMaxAnswersValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
    

    尽管这三条线只有4千字节,但你可以想象4*10*207相当多。在ASP不为我生成行的情况下,如何将所有验证器标记为动态的并将EvaluationFunction设置为相同的值?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Andy Rose    15 年前

    当EnableClientScript选项设置为true时,此代码由ASP.NET自动生成。据我所知,唯一摆脱它的方法是将其设置为false,但是明显的缺点是,验证只在回发期间在服务器端发生。
    为了解决这个问题,您可以将自定义的javascript验证函数与相关的控件事件(如文本框onblur事件)绑定在一起,但是在不了解有关您试图验证的值的更多详细信息的情况下,很难进一步推测这是否是一个解决方案。

        2
  •  1
  •   Seth Reno    15 年前

    此javascript由system.web.ui.webcontrols命名空间中basevalidator&customvalidator类的addAttributesTorender()方法呈现给客户端。看看里面的 Reflector .

    Protected Overrides Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)
      ...
      If (enumValue <> ValidatorDisplay.Static) Then
        Me.AddExpandoAttribute(writer2, clientID, "display", PropertyConverter.EnumToString(GetType(ValidatorDisplay), enumValue), False)
      End If
      ...
      MyBase.AddExpandoAttribute(writer2, clientID, "evaluationfunction", "CustomValidatorEvaluateIsValid", False)
    End Sub
    

    您可以编写自己的类来替换CustomValidator并更改其呈现方式。 但是,在这种情况下,我认为最好编写自己的javascript来处理验证,而不是使用验证程序控件。

    另外,如果您担心HTML的大小,首先应该在您的IIS服务器上启用gzip压缩。