Laden...

CustomValidator ClientValidationFunction Zugriff auf Property

Erstellt von hen.klemp vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.841 Views
H
hen.klemp Themenstarter:in
13 Beiträge seit 2009
vor 12 Jahren
CustomValidator ClientValidationFunction Zugriff auf Property

Hallo Community,

ich habe ein Problem mit dem CustomValidator.
Ich habe ein User Control welches eine TextBox und den Custom Validator enthält.


<%@ Control Language="C#" AutoEventWireup="true" CodeFile="NumericTextBox.ascx.cs"
    Inherits="NumericTextBox" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
<asp:TextBox ID="txtValue" runat="server"></asp:TextBox>
<asp:CustomValidator ID="cvValue" runat="server" ControlToValidate="txtValue" ClientValidationFunction="CheckItem"
    Display="Static" ErrorMessage="test" >
</asp:CustomValidator>

<script type="text/javascript">
    function CheckItem(sender, args) {
        var orderMultiplie = sender.getElementsByTagName("OrderMultiplie");
           alert(orderMultiplie)
       }
</script>

Mein Control habe ich um das Property OrderMultiplie erweitert.

Wenn ich nun mein Controll Verwende


<NumericTextBox runat="server" ID="txtQuantity" Value="0" OrderMultiplie="Test"/>

Schaffe ich es nicht innerhalb der CheckItem auf den Wert des Properties zu zugreifen.

Hat jemand eine Idee?

Gruß Hendrik

I
194 Beiträge seit 2005
vor 12 Jahren

Hallo,

so wie ich das jetzt verstehe, möchtest du einfach clientseitig per Javascript das Property deines Custom Controls "txtQuantity" auslesen, oder? der customvalidator spielt dabei aber nur zufällig eine rolle, daher stimmt der titel nicht ganz 😉

ich würde mir mal folgendes ansehen:
http://msdn.microsoft.com/en-us/library/bb386450.aspx
http://www.asp.net/ajaxlibrary/act_contribute_codingStandards_Design.ashx

Stichwort: Ajax Server Control

Lg ingemar

H
hen.klemp Themenstarter:in
13 Beiträge seit 2009
vor 12 Jahren

Danke ingemar!

Das ist genau das richtige.

Ich habe es soweit auch schon umgebaut.
Aber leider bekomme ich nun immer eine Fehlermeldung.

Immer wenn ich meine Seite öffne bekomme ich folgende Meldung


Laufzeitfehler in Microsoft JScript: 'MyNameSpace' ist undefiniert

das gerenderte JavaScript sieht so aus


Sys.Application.add_init(function() {
    $create(MyNameSpace.NumericTextBox, {"OrderMultiplie":"2,00000000000000000000"}, null, null, $get("ctl00_cph1_ctl00_dvCatalogView_ctl02_txtQuantity"));
});

NumericTextBox.ascx


<%@ Control Language="C#" AutoEventWireup="true" CodeFile="NumericTextBox.ascx.cs"
    Inherits="MyNameSpace.NumericTextBox" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
<asp:TextBox ID="txtValue" runat="server"></asp:TextBox>
<asp:CustomValidator ID="cvValue" runat="server" ControlToValidate="txtValue" ClientValidationFunction="CheckItem"
    Display="Static" >
</asp:CustomValidator>

<script type="text/javascript">
    function CheckItem(sender, args) {
        alert('test');
        alert(this.OrderMultiplie);
    },
</script>

NumericTextBox.ascx.cs


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;


namespace MyNameSpace
{
    public partial class NumericTextBox : BaseNopUserControl, IScriptControl
    {
        public string OrderMultiplie { get; set; }
        private ScriptManager sm;

        protected override void OnPreRender(EventArgs e)
        {
            if (!this.DesignMode)
            {
                // Test for ScriptManager and register if it exists
                sm = ScriptManager.GetCurrent(Page);

                if (sm == null)
                    throw new HttpException("A ScriptManager control must exist on the current page.");

                sm.RegisterScriptControl(this);
            }

            base.OnPreRender(e);
        }

        protected override void Render(HtmlTextWriter writer)
        {
            if (!this.DesignMode)
                sm.RegisterScriptDescriptors(this);

            base.Render(writer);
        }

        public string OrderMultiplieErrorMessage
        {
            get
            {
                return cvValue.ErrorMessage;
            }
            set
            {
                cvValue.ErrorMessage = value;
            }
        }


        #region IScriptControl Member

        public System.Collections.Generic.IEnumerable<ScriptDescriptor> GetScriptDescriptors()
        {
            ScriptControlDescriptor descriptor = new ScriptControlDescriptor("MyNameSpace.NumericTextBox", this.ClientID);
            descriptor.AddProperty("OrderMultiplie", this.OrderMultiplie);

            return new ScriptDescriptor[] { descriptor };
        }

        public System.Collections.Generic.IEnumerable<ScriptReference> GetScriptReferences()
        {
            ScriptReference reference = new ScriptReference();
            reference.Path = ResolveClientUrl("js/NumericTextBox.js");

            return new ScriptReference[] { reference };

        }

        #endregion
    }
}


NumericTextBox.js


/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("MyNameSpace");

MyNameSpace.NumericTextBox = function(element) {
    MyNameSpace.NumericTextBox.initializeBase(this, [element]);
    this.OrderMultiplie = null;
}

MyNameSpace.NumericTextBox.prototype = {
    initialize: function() {
        MyNameSpace.NumericTextBox.callBaseMethod(this, 'initialize');

        // Benutzerdefinierte Initialisierung hier hinzufügen
    },

    getOrderMultiplie: function() {
        return this.OrderMultiplie;
    },

    dispose: function() {
        //Benutzerdefinierte Löschaktionen hier einfügen
        MyNameSpace.NumericTextBox.callBaseMethod(this, 'dispose');
    }
}
MyNameSpace.NumericTextBox.registerClass('MyNameSpace.NumericTextBox', Sys.UI.Control);

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();


In meiner Seite habe ich das so eingebunden


<%@ Register TagPrefix="my" TagName="NumericTextBox" Src="~/Modules/NumericTextBox.ascx" %>


<asp:UpdatePanel ID="updPanelQuantity" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>
                                <my:NumericTextBox runat="server" ID="txtQuantity" Value="0" OrderMultiplie='<%#Eval("OrderMultiple")%>'></my:NumericTextBox>
                            </ContentTemplate>
                        </asp:UpdatePanel>


Die Beispiel die ich noch im Internet gefunden habe, haben das Controll in ein eigenes Projekt ausgelager. Ich vermute ich hab etwas bei der Regestrierung falsch geamcht , aber ich bin die letzen 4 std. nicht darauf gekommen wo ran es hackt. Fällt euch etwas auf?

Gruß Hendrik