2014-02-07 75 views
3

我有一類叫做CustomValidation我目前調用我的C#代碼的一些邏輯:我可以在ASPX頁面中調用另一個類的方法嗎?

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?) 

有沒有一種方法調用從CustomValidation方法類在我的ASPX代碼?我試過以下無濟於事:

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

回答

4

您可以通過一個staticdelegate實現這一目標。

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

如果我將我的方法更改爲靜態,我得到'Member'RetailCrime.CustomValidation.ValidateEmail(string)'無法通過實例引用進行訪問;使用類型名稱來限定它。 – mrcoulson

+0

嘗試使用'CustomValidation'來限定它,即'CustomValidation.ValidateEmail' –

+0

我認爲那是因爲你在另一個地方用實例調用它。嘗試複製該方法並將其稱爲ValidateEmailStatic,然後重試。 –

0

聽起來好像你有一個驗證器方法,你想從至少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("[email protected]"); 
MySecondClass two = new MySecondClass(); 
two.ValidateEmail("[email protected]"); 

這個例子還遠遠沒有完成,它被放在一起展示瞭如何使用擴展方法將該電子郵件驗證從該類中取出。很顯然,當你已經擁有目標實例時,你爲什麼會傳遞電子郵件?

我的最終建議,電子郵件驗證和驗證一般都是一次又一次完成的。不需要重新發明輪子。我確信有一個bazillion框架,但我最喜歡的是FluentValidations。 NuGet使其設置起來非常容易。

+0

這將需要我的例子重新工作,但我會深入研究它。爲什麼我不使用現有的框架進行驗證?我只是喜歡寫代碼,所以有時候我喜歡重新發明輪子,以便找到新的見解。 – mrcoulson

+0

是的,我瞭解重做。它不是一個快速解決方案。我也喜歡寫代碼。事實上,你可以瘋狂地使用擴展,並通過讓擴展方法返回其他事物的實例來開始編寫自己的流利的東西。你可以像'myObj.ValidateThis()。和.ValidateThat()'一樣。玩的開心! –

相關問題