透過OpenAccessLinqDataSource的Expression Editor建立物件屬性預設值
運算式編輯器是一個挺好玩的工具,這篇我們來看一下新增和修改時,透過它建立屬性預設值的方式和一點小技巧。
經過前兩篇的洗禮,應該對運算式編輯器很熟悉了,所以話不多話,直接看一下 Insert、Update 的運算式編輯器畫面:
PS. 因為 Insert、Update、Delete 的運算式編輯器畫面長的都一樣,所以只抓 Update 的畫面做代表。
和前兩篇 Where、OrderBy 的畫面長的不一樣囉,少了輸入運算式的地方,只能直接繫結資料來源。那這裡的繫結資料來源,會發生什麼樣的作用呢?以下圖為例:
參數名稱必須是實體物件的屬性,這樣在新增、修改資料時,就會用我們所設定的值當做該屬性預設值,回寫底層資料庫。但這裡有兩個地方要特別留心,因為常常因此造成非預期結果,也就是屬性回寫資料庫後,不是我們所設定的值:
參數名稱必須是實體物件的屬性名稱。請注意,若不小心打錯字,參數名稱對應不上屬性名稱,編譯不會有錯誤,執行時期也不會發生例外,唯一發生的狀況就是回寫資料庫的欄位沒有預設值,很容易就被我們忽略掉,直到客戶回報時才發現,這就囧了。
該屬性必須在資料來源中已定義,但未在資料控制項中繫結。例如我們查詢出 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
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="InsertUpdateByExpressionEditor.aspx.vb" Inherits="OALinqDataSourceWeb01.InsertUpdateByExpressionEditor" %>
<%@ Register Assembly="Telerik.OpenAccess.Web.40" Namespace="Telerik.OpenAccess.Web" TagPrefix="telerik" %>
<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" />
<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>
InsertUpdateByExpressionEditor.aspx.vb
Public Class InsertUpdateByExpressionEditor
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 的結果為何:
第一個示範,我們只填寫了類別名稱,但是新增時,我們會發現類別描述套用在運算式編輯器所建立的 Description 預設值。這裡大家可以試著把參數名稱打錯,就會發現新增完,Description 沒有預設值囉,這個簡單的練習就不示範了。
第二個示範,我們在 GridView 中有建立一個 BoundField 繫結 Description 屬性,所以更新資料後,會發現實際回寫 Description 的值,是在 GridView 中所輸入的內容,而非參數預設值。