【问题标题】:Can I call a method from another class in an ASPX page?我可以从 ASPX 页面中的另一个类调用方法吗?
【发布时间】:2014-03-05 01:17:33
【问题描述】:

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

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" />

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您可以通过创建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" />
    

    【讨论】:

    • 如果我将方法更改为静态,我会得到Member 'RetailCrime.CustomValidation.ValidateEmail(string)' cannot be accessed with an instance reference; qualify it with a type name instead
    • 尝试用CustomValidation来限定它,即CustomValidation.ValidateEmail
    • 我认为这是因为你在另一个地方用实例调用它。尝试复制该方法并将其命名为 ValidateEmailStatic 并重试。
    • 是的,这就是问题所在。再试一次:)
    • 嗨。我的方法现在在我的类中是静态的,我仍然收到“不包含定义”错误。如果我尝试将其称为 &lt;%= CustomValidation.ValidateEmail(someEmailField.Text) %&gt;,则会被告知“预期标识符”。
    【解决方案2】:

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

    虽然静态方法有效,但您可以静态访问在编辑用户页面类中定义的验证方法。但是这种电子邮件验证确实非常通用,并且不仅可以用于编辑用户。因此,如果您查看原始错误“...不包含 '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 让设置变得异常简单。

    【讨论】:

    • 这将需要对我的示例进行一些修改,但我会深入研究它。为什么我不直接使用现有的框架进行验证?我只是喜欢编写代码,所以有时我喜欢重新发明轮子,以便找到新的见解。
    • 是的,我了解返工。它不是一个快速的解决方案。我也喜欢写代码。事实上,你可以疯狂地使用扩展,并通过让扩展方法返回其他事物的实例来开始编写自己的流利的东西。你可以去myObj.ValidateThis().And.ValidateThat()之类的东西。玩得开心!
    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多