re: 利用 BasePage 实作窗体权限控管 jeff377 2008-09-03 23:52
@mzc
提供我的作法供你参考,我的BasePage会有一个FuncTag属性(功能代码),在取用户在该页面的权限时,会将FuncTag传给中间层以取得用户在该功能的权限。
re: SqlDataSource 執行資料篩選 jeff377 2008-08-31 09:51
@陈晨
我当然了解由商业逻辑层去处理筛选是最好的,只是本文的重点是在SqlDataSoruce,是给使用SqlDataSoruce的使用者参考。我在撰写ASP.NET程序是完全不去使用SqlDataSource的,而是使用自行改写过的通用的ObjectDataSource来连结商业逻辑对象。
re: 利用 BasePage 实作窗体权限控管 jeff377 2008-08-28 19:02
@mzc
首先有个数据表去存放「用户/功能的权限设定」数据,包含「用户编号、功能代码、权限值」三个字段,
可以透过特定组件去数据库抓取这个目前登入用户在该页面(功能)的权限值。
re: 字符串中寻找关键词片段 jeff377 2008-08-27 21:39
@lexus
以「包含”连胡会”这个关键词片段,并包含关键词前后文各10个字符」这个案例来说,它的正则式为 “.{0,10}连胡会.{0,10}”
@liaoost
你有二种作法
1.勾选单一CheckBox后马上PostBack,则采用本文的作法。
2.勾选多个CheckBox后,按钮PostBack,取得所有勾选的数据列。这方法你可以 GridView.Rows 逐列去 FindControl 找到该列的 CheckBox,再判断是否被勾选。
附注:以上作法GridView皆需启用ViewState。
@liaoost
它的错误讯息是因为你的数据来源未包含 Discontinued 这个字段所导致。你要系结实际数据来源中确定存在的字段。
@liaoost
這要看你是要在那個 Template 中使用 CheckBox,在 ItemTemplate 及 EditItemTemplate 都可以運作。
這個案例是會同步更新的,因為它的 GridView 及 DetailView 是繫結同一個 DataSource。
@落木
那是參考 ASP.NET AJAX 的組件,所以在 TBScriptManager 類別中才可以使用 ScriptManager
re: 每个字符旋转随机角度的图象验证码 V2.0 jeff377 2008-06-23 13:12
@Oran
如果把噪声变淡了或跟文字颜色容易区分,那很容易用影像处理中的二值化,一下就切割出文字,再复杂的噪声也无用武之处。
re: 每个字符旋转随机角度的图象验证码 V2.0 jeff377 2008-06-23 08:24
re: 每个字符旋转随机角度的图象验证码 V2.0 jeff377 2008-06-22 19:42
噪声是非常重要的一点,好的噪声会让程序无法正确分割文字,教你一个最简单且很难分割的噪声,就是在图形上画一条不规则的横向曲线横跨文字,而且曲线颜色跟文字一样。噪声曲线跟文字一样颜色(黑色)的目的是要让二值化无法将文字撷取出来。
@茄哩啡.NET
我在台湾工作,偶尔才会到大陆去出差
@丹空竹
我研究所的论文就是在做类神经网络处理文字辨识,以你的例子而言,旋转随意角度对辨识来说并不会有太大影响,只要抓字的重心,360度旋转抓取特微值,还是可以辨识的出来。
通常文字辨识的有一个重要的动作,就是要把个别文字分割,你只要把文字弄的难分割就有不错的安全性。
@daydayupayup
纯图形的好处是不容易使用机器识别,那是属于影像处理的一问学问,不过颜色多不见得不好识别,有时反而是人眼不好识别而机器易识别,因为颜色多的图形验证码,有时只要有二值化就很容易撷取出文字部分,最好的图形验证码是人眼易识别而机器难识别。
像Yahoo登入的纯黑白验证码就写的非常好(噪声简单,人眼又易识别),可是要用机器识别难度就非常高,为研究我曾使用类神经网络(人工神经网络)尝试去识别它的图形,成功率相当低。
这个跟 ViewState 加密无关,你从 IE 检视 HTML 码,就有辨法找到那个图形验证码的值,这样只要用程序去控制操作 IE 就能破解了。
你的验证控件是使用底图上加文字,这样安全性是不高的,机器人程序很容易就破解了,建议比较好的方式是含文字整个都是图形,这样用程序比较难破解。
当然也有人使用影像识别的技术可以自动辨识,不过这个难度比识别码内含在 HTML 码中难多了。
re: GridView 数据异动前的字段检查 jeff377 2008-06-13 21:53
@恋恋风尘
除了可以在Client端使用JavaScript处理的简单验证外,我还是认为应该尽量往底层处理数据验证的动作。
例如你在GridView做验证,当程序代码中有使用到SqlDataSource.Update在异动数据,那不就还要再重复写一次了吗?
若是系统是属性三层式架构,例如以ObjectDataSource连结中间层商业逻辑组件,那数据验证的动作就要往中间层商业逻辑组件中处理;因为以后若有其它的前端(如 WinForm、WebService)要连接这个商业逻辑组件,就无需再写一次数据验证动作了。
re: GridView 数据异动前的字段检查 jeff377 2008-06-13 17:47
@kiler
我知道....文章中有说明了,这只是为了测试中间层验证的动作而已,不是真的要在中间层做空字符串的验证。
re: SqlDataSource 執行資料篩選 jeff377 2008-06-12 23:25
@wuya2
设定 FilterExpression 属性的做法,它是针对 DataView 下 Filter,所以会先取回所有数据再针对 DataView 下 Filter;若数据非常多时(例如十万笔数据),而筛选符合的数据只有几笔,效能上会比较不好。
re: SqlDataSource 執行資料篩選 jeff377 2008-06-12 23:22
@陈晨
你要先了解ASP.NET 事件的顺序,Page Load 事件会比按钮的 Click 事件先发生,你的作法会发生先判断 ViewState设定 SelectCommand,后面才去设定 ViewState,会跟预期的执行顺序相反。
2楼的方法当然也可行,不过它只有限制筛选字段是固定的状况下才可以使用。
@要有好的心情
针对批量更新的问题,如同你说的一样,我设计的TBObjectDataSoruce 控件的 UpdateMethod、InsertMethod、DeleteMethod
就是直接存取 TBBusinessObject 控件,并不是直接呼叫中间层去异动数据库。
re: 利用 BasePage 实作窗体权限控管 jeff377 2008-06-11 22:59
@麦舒
新增、删除、修改可以在一个页面中处理,为了配合 Membership以及Role,而将其分成三个页面,这样不是更难维护了吗?
若认为 ViewState 不安全,可以将其储存在 Catch或其它地方中就可以解决此问题,而且这段程序代码在 BasePage 中,可以随意依情形修正储存目的。
re: 利用 BasePage 实作窗体权限控管 jeff377 2008-06-11 20:01
@麦舒
问题就是Asp.net提供的Membership以及Role无法做到细部的操作权限控管,即同一个页面具有「浏览、新增、删除、修改...等」操作权限。
麻烦也给我一份程序代码,谢谢。
email:jeff377@hotmail.com
msn:jeff377@hotmail.com
blogsAdd: http://www.cnblogs.com/jeff377/
老家:台湾
re: 利用 BasePage 实作窗体权限控管 jeff377 2008-06-11 09:33
@小寒
基本上功能权限的控管的对象是窗体(页面),所以若是多笔的状况(如 GridView),若有编辑权限,则所有多笔记录皆可编辑。
而操作权限可能会非常多种,以 ERP 系统为例,可能就包含「执行/浏览、新增、删除、修改、打印、汇出、核决...等」操作权限,这样操作权限的控管还要配合其它 UI 的自订控件才比较完整。
re: 利用 BasePage 实作窗体权限控管 jeff377 2008-06-11 09:22
@good man
我会使用 BasePage 是有原因的,因为其它的自订服务器控件还可以跟 BasePage 做互动,例如自订工具列(Toolbar)控件,其中有「新增、修改、删除...」等按钮,而 Toolbar 本身就可以判断 BasePage 的使用者权限,自动将相关按钮设为启用/失效。这样开发人员可以不会管到任何权限控管的部分,只需负责撰写商业逻辑的部分。
@要有好的心情
新增一个字段(字段)是否要同步更新中间层,这个要看你的中间层怎么写,我开发的系统所有的字段都是用定义出来的,也就是开发人员不用直接去下 SQL 语法,这种情形下就算增减字段,中间层是无预做任何异动。
批次异动的问题,在一般的 Web 系统比较不会发生,不过若是开发 Web ERP,那批次异动的需求就很大。就像你说的,这种批次异动比较适合使用 WinForm,这点我当然也了解,不过客户的需求就是要硬要使用 WebForm 而不用 WinForm 的 ERP 系统,那就没辨法了。
@nicye
不可能只多了 InsertParamter 就可以,你沒有去更改 Insert 方法的相關參數怎麼可能會處理到該欄位。
@Amir Ai
你可以試著去動態產生 GridView 的 Columns,你會發覺使用 TemplateField 相當麻煩。
@kiler
我指的順序是 GridView.Columns 的欄位順序,並不是資料排序。例如預設「產品編號、產品名稱、數量、單價」,而用戶可以自訂為「數量、單價、產品編號、產品名稱」,也可以將部分的 Column 隱藏。
我比較少用 TemplateField,因為我們的系統中的 GridView 需要提供每個用戶端可以自定 Columns 的順序,而 TemplateField 在動態建立或更換順序時會比較麻煩,所以會把所有會使用到 DataControlField 類型全實作出來。
re: 如何序列化Control等复杂类型对象 jeff377 2008-05-27 18:24
收藏
re: 表達式解析運算器(二)-- 算法實現 jeff377 2008-05-27 12:45
@金色海洋(jyk)
使用整數值來表達複選是有使用時機的,例如權限設定「瀏覽=1 新增=2 修改=4 刪除=5」,當使用者判斷該表單是否有修改權時,只需要判斷 (權限值 And 4)=4 就代表有修改權。
@BrianLei(Lei)
謝謝您的指正,CreateChildControls 的確要返回值,這部分沒注意到。
不過可能是 VB.NET 的原因它竟然編譯成功沒有錯誤訊息。
應修正如下:
Protected Overrides Function CreateChildControls(ByVal DataSource As System.Collections.IEnumerable, ByVal DataBinding As Boolean) As Integer
Dim iRowCount As Integer
Dim oTable As Table
iRowCount = MyBase.CreateChildControls(DataSource, DataBinding)
If Me.EmptyShowHeader AndAlso (iRowCount = 0) Then
oTable = CreateEmptyTable()
Me.Controls.Clear()
Me.Controls.Add(oTable)
End If
Return iRowCount
End Function