[英]Assign C# Lambda Func in Aspx
我有一個自定義控件,我想將方法公開為屬性(例如,用於自定義驗證);
public Func<bool> ValidateMatrixFunc { get; set; }
然后在包含此自定義控件的頁面中,我可以使用委托或lambda exp來分配頁面的OnPreInit事件;
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
ucMatrixTable.ValidateMatrixFunc = ValidateMatrix;
}
這很有效。
但是,我認為在aspx中執行此操作會更方便,如:
<uc1:MatrixTable ID="ucMatrixTable" runat="server" ValidateMatrixFunc="ValidateMatrix" />
但是這會崩潰並顯示以下消息:
無法從其'ValidateMatrixFunc'屬性的字符串表示'ValidateMatrix'創建'System.Func`1 [[System.Boolean,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'類型的對象。
所以,我只是想知道......我想知道......如果一些忍者知道這個問題的答案,或者它只是生活中的一個謎,我們永遠不會得到。
您可能希望將“ValidateMatrixFunc”屬性公開為事件。 為什么? 它與通常實施控件的方式更為一致。 此外,事件允許您為單個事件擁有多個訂閱者(事件處理程序)。 雖然這可能不是典型的用例,但有時會發生。
我在下面描述了如何將其作為事件實現:
我們將事件稱為“ValidatingMatrix”。
然后你可以像這樣寫你的ASPX標記:
<uc1:MatrixTable ID="ucMatrixTable" runat="server" OnValidatingMatrix="ValidateMatrix" />
另外,讓我們使用CancelEventHandler
委托代替Func<bool>
。 這意味着您的代碼隱藏中的ValidateMatrix方法簽名必須如下所示:
protected void ValidateMatrix(object sender, System.ComponentModel.CancelEventArgs e)
{
// perform validation logic
if (validationFailed)
{
e.Cancel = true;
}
}
在MatrixTable自定義控件內部,實現以下內容:
const string ValidatingMatrixEventKey = "ValidatingMatrix";
public event System.ComponentModel.CancelEventHandler ValidatingMatrix
{
add { this.Events.AddHandler(ValidatingMatrixEventKey, value); }
remove { this.Events.RemoveHandler(ValidatingMatrixEventKey, value); }
}
protected bool OnValidatingMatrix()
{
var handler = this.Events[ValidatingMatrixEventKey] as System.ComponentModel.CancelEventHandler;
if (handler != null)
{
// prepare event args
var e = new System.ComponentModel.CancelEventArgs(false);
// call the event handlers (an event can have multiple event handlers)
handler(this, e);
// if any event handler changed the Cancel property to true, then validation failed (return false)
return !e.Cancel;
}
// there were no event handlers, so validation passes by default (return true)
return true;
}
private void MyLogic()
{
if (this.OnValidatingMatrix())
{
// validation passed
}
else
{
// validation failed
}
}
它將函數名稱解釋為文字。 嘗試使用數據綁定表達式http://msdn.microsoft.com/en-us/library/bda9bbfx(v=vs.71).aspx
你需要玩它,但這是一個可能的例子:
<uc1:MatrixTable ID="ucMatrixTable" runat="server" ValidateMatrixFunc="<%# ValidateMatrix %>" />
ASP.NET使用TypeConverters
轉換通過標記分配的屬性值的string
表示形式,以將string
轉換為屬性的正確類型。 該錯誤告訴您Func
類型沒有已注冊的TypeConverter
。 TypeConverter
必須在類本身上注冊,因此這不是你可以做的事情,並且無論如何我認為它不會讓你實現你想要的東西。
這種方法不起作用,但您的基本目標非常普遍: 使用EventHandlers而不是Funcs 。 有關更多信息,請參閱此MSDN文章: http : //msdn.microsoft.com/en-us/library/system.eventhandler.aspx
你的“return”bool應該在事件處理程序中實現:
public void GetCurrentRecords(object sender, EventArgs e)
{
var obj = sender as Lcmp.Website.Data.Controls.AFTO95ViewerControl;
obj.ValidateMatrixFunc = whatever;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.