簡體   English   中英

在Aspx中分配C#Lambda Func

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM