透過OpenAccessLinqDataSource的Expression Editor建立物件屬性預設值

  • 2485
  • 0

透過OpenAccessLinqDataSource的Expression Editor建立物件屬性預設值

運算式編輯器是一個挺好玩的工具,這篇我們來看一下新增和修改時,透過它建立屬性預設值的方式和一點小技巧。

----------

經過前兩篇的洗禮,應該對運算式編輯器很熟悉了,所以話不多話,直接看一下 Insert、Update 的運算式編輯器畫面:

221850

PS. 因為 Insert、Update、Delete 的運算式編輯器畫面長的都一樣,所以只抓 Update 的畫面做代表。

和前兩篇 Where、OrderBy 的畫面長的不一樣囉,少了輸入運算式的地方,只能直接繫結資料來源。那這裡的繫結資料來源,會發生什麼樣的作用呢?以下圖為例:

222323

參數名稱必須是實體物件的屬性,這樣在新增、修改資料時,就會用我們所設定的值當做該屬性預設值,回寫底層資料庫。但這裡有兩個地方要特別留心,因為常常因此造成非預期結果,也就是屬性回寫資料庫後,不是我們所設定的值:

  1. 參數名稱必須是實體物件的屬性名稱。請注意,若不小心打錯字,參數名稱對應不上屬性名稱,編譯不會有錯誤,執行時期也不會發生例外,唯一發生的狀況就是回寫資料庫的欄位沒有預設值,很容易就被我們忽略掉,直到客戶回報時才發現,這就囧了。
  2. 該屬性必須在資料來源中已定義,但未在資料控制項中繫結。例如我們查詢出 CategoryId、CategoryName、Description,但是在資料繫結時,只繫結了 CategoryId 和 CategoryName,這樣 Description 的預設值才會生效。

現在我們在 Web 專案中加入一個新的 WebForm 名為 InsertUpdateByExpressionEditor.aspx,加入以下控制項,目的就是為了展示 Description 屬性預設值,什麼情況會生效和失效:

  • 一個 TextBox,名為 txtCategoryName,用來輸入要新增的類別名稱。
  • 一個 Button,名為 btnCreate,Click 時會抓 txtCategoryName 的值,然後調用 oasrcInsertCategories 控制項的 Insert 函式。
  • 一個 Label,名為 lblLog,用來顯示執行結果和執行的 Sql Script。
  • 一個 OpenAccessLinqDataSource,名為 oasrcInsertCategories,負責執行 Insert Categories 作業,透過運算式編輯器撰寫 Insert 時,Description 屬性的預設值。
  • 一個 OpenAccessLinqDataSource,名為 oasrcCategories,負責查詢 Categories 資料,並執行 Update 作業,我們會透過運算式編輯器撰寫 Update 時,Description 屬性的預設值。
  • 一個 GridView,名為 gvList,以 oasrcCategories 為資料來源,顯示查詢結果,並啟用編輯功能。

InsertUpdateByExpressionEditor.aspx



<%@ Register Assembly="Telerik.OpenAccess.Web.40" Namespace="Telerik.OpenAccess.Web" TagPrefix="telerik" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>透過運算式編輯設定新增和修改的類別描述預設值</title>
    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" />
</head>
<body>
    <form id="form1" runat="server">
        <div>
            類別名稱:<asp:TextBox ID="txtCategoryName" runat="server"></asp:TextBox>
            <asp:Button ID="btnCreate" runat="server" Text="新增類別" CssClass="btn-mini btn-primary" />
            <br />
            <asp:Label ID="lblLog" runat="server" ForeColor="Red"></asp:Label>
            <telerik:OpenAccessLinqDataSource ID="oasrcInsertCategories" runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EnableInsert="True" EntityTypeName="" ResourceSetName="Categories">
                <InsertParameters>
                    <asp:Parameter Name="DESCRIPTION" DefaultValue="這是類別描述預設值" />
                </InsertParameters>
            </telerik:OpenAccessLinqDataSource>
            <asp:GridView ID="gvList" runat="server" AutoGenerateColumns="False" DataKeyNames="CATEGORYID" DataSourceID="oasrcCategories">
                <Columns>
                    <asp:BoundField DataField="CATEGORYID" HeaderText="CATEGORYID" ReadOnly="True" InsertVisible="False" SortExpression="CATEGORYID"></asp:BoundField>
                    <asp:BoundField DataField="CATEGORYNAME" HeaderText="CATEGORYNAME" SortExpression="CATEGORYNAME"></asp:BoundField>
                    <asp:BoundField DataField="DESCRIPTION" HeaderText="DESCRIPTION" SortExpression="DESCRIPTION"></asp:BoundField>
                    <asp:CommandField ShowEditButton="True"></asp:CommandField>
                </Columns>
            </asp:GridView>
            <telerik:OpenAccessLinqDataSource ID="oasrcCategories" runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EntityTypeName="" ResourceSetName="Categories" EnableUpdate="true">
                <UpdateParameters>
                    <asp:Parameter Name="DESCRIPTION" DefaultValue="這是類別描述預設值" />
                </UpdateParameters>
            </telerik:OpenAccessLinqDataSource>
        </div>
    </form>
</body>
</html>

InsertUpdateByExpressionEditor.aspx.vb


    Inherits System.Web.UI.Page
    Private tracer As MyNorthwindTraceListener

    Private Sub InsertByExpressionEditor_Init(sender As Object, e As EventArgs) Handles Me.Init
        If tracer Is Nothing Then
            tracer = New MyNorthwindTraceListener(New StringBuilder())
        End If
    End Sub

    Private Sub btnCreate_Click(sender As Object, e As EventArgs) Handles btnCreate.Click
        Dim listDictionary As New ListDictionary()
        listDictionary.Add("CATEGORYNAME", txtCategoryName.Text.Trim())
        lblLog.Text = ""
        Try
            Dim tracer = New MyNorthwindTraceListener(New StringBuilder())
            oasrcInsertCategories.Insert(listDictionary)
            lblLog.Text &= "<br />新增成功。<br />" & tracer.GetLogString()
            gvList.DataBind()
        Catch ex As Exception
            lblLog.Text &= ex.Message
        End Try
    End Sub

    Private Sub oasrcCategories_Updated(sender As Object, e As Telerik.OpenAccess.Web.OpenAccessLinqDataSourceStatusEventArgs) Handles oasrcCategories.Updated
        lblLog.Text = tracer.GetLogString()
    End Sub
End Class

我們先執行新增作業,看 Description 是否以預設值呈現,接著我們在 GridView 中,編輯剛剛那筆資料,把 Description 的值換掉,並按【更新】連結,看 Description 的結果為何:

InsertUpdateByExpressionEditor

第一個示範,我們只填寫了類別名稱,但是新增時,我們會發現類別描述套用在運算式編輯器所建立的 Description 預設值。這裡大家可以試著把參數名稱打錯,就會發現新增完,Description 沒有預設值囉,這個簡單的練習就不示範了。

第二個示範,我們在 GridView 中有建立一個 BoundField 繫結 Description 屬性,所以更新資料後,會發現實際回寫 Description 的值,是在 GridView 中所輸入的內容,而非參數預設值。

--------
沒什麼特別的~
不過是一些筆記而已