我可以从ASPX页面中的另一个类调用方法吗?

时间:2014-02-07 15:00:03

标签: c# asp.net

我在一个名为CustomValidation的类中有一些逻辑,我目前正在调用我的C#代码:

protected void EmailValidator(object source, ServerValidateEventArgs args)
{
    string strInput = args.Value.Trim();
    CustomValidation v = new CustomValidation();
    args.IsValid = v.ValidateEmail(strInput);
}

我宁愿从我的ASPX页面调用这些方法来简化操作,例如:

<asp:CustomValidator OnClick="ValidateEmail" />

但是,由于ValidateEmail与页面不在同一个类中:

'ASP.editusers_aspx' does not contain a definition for 'ValidateEmail' and no extension method 'ValidateEmail' accepting a first argument of type 'ASP.editusers_aspx' could be found (are you missing a using directive or an assembly reference?)

有没有办法在我的ASPX代码中调用CustomValidation类的方法?我试过以下无济于事:

<%@ Import Namespace="ThisProject.CustomValidation" %>

OnClick="<%= CustomValidation.ValidateEmail()" %>

以下是我在上下文中的用法:

<asp:TextBox ID="txtEmail" runat="server" Text='<%# Bind("UserEmail") %>' MaxLength="30" />
<asp:CustomValidator ID="vldEmail" runat="server" ControlToValidate="txtEmail" ValidateEmptyText="true" OnServerValidate='<%# RetailCrime.CustomValidation.ValidateEmail((string)(txtEmail.Text)) %>' ErrorMessage='<br /><label class="invisible noplaceholder">&nbsp;</label>Please enter a valid email.' Display="Dynamic" CssClass="validatormessage" />

2 个答案:

答案 0 :(得分:4)

您可以通过制作static delegate来实现此目标。

public class CustomValidator
{
    public static void EmailValidator(object source, ServerValidateEventArgs args)
    {
        string strInput = args.Value.Trim();
        CustomValidation v = new CustomValidation();
        args.IsValid = v.ValidateEmail(strInput);
    }
}

<asp:CustomValidator OnClick="CustomValidator.EmailValidator" />

答案 1 :(得分:0)

听起来您有一个要从至少2页或更多页面访问的验证方法。记住单一责任原则。

虽然静态方法有效,但您可以静态访问edit users页面类中定义的验证方法。但是这个电子邮件验证非常通用,不仅可以用于编辑用户。因此,如果您查看原始错误“...不包含'ValidateEmail'的定义且没有扩展方法......”,您可以创建扩展方法。

要扩展一个类,您需要一个通用接口来应用于您想要扩展的任何类。例如:

public interface IMyValidations { }

并创建扩展类

public static class MyValidations
{
    public static void ValidateEmail(this IMyValidations target, string input)
    {
        // magic happens here
    }
}

并创建具体类

public class MyFirstClass : IMyValidations
{
}

public class MySecondClass : IMyValidations
{
}

无论您在何处创建具体类的实例,都可以将该方法作为实例方法访问

 MyFirstClass one = new MyFirstClass();
 one.ValidateEmail("foo@bar.com");
 MySecondClass two = new MySecondClass();
 two.ValidateEmail("hello@world.com");

此示例远未完成,它被抛出在一起以显示如何使用扩展方法从该类中获取该电子邮件验证。显然,当你已经拥有目标实例时,为什么要传递电子邮件?

我的最终建议,电子邮件验证和一般验证已经一次又一次地完成。无需重新发明轮子。我确信那里有很多框架,但我最喜欢的是FluentValidations。 NuGet设置起来非常容易。