在ASP.NET 2.0中操作数据之二十三:基于用户对修改
介绍ASP.NET 2.0如何掌控数据修改权限:权限的精细划分与实现
在Web应用程序中,用户账号的权限管理至关重要。ASP.NET 2.0提供了强大的工具来管理用户权限,允许开发者根据用户的角色和身份来控制对数据的查看和修改。本文将深入如何在ASP.NET 2.0中实施这种控制,确保只有拥有权限的用户才能对数据进行修改。
在Web应用程序的日常运营中,不同的用户角色需要访问不同的数据,并可能进行不同的操作。例如,供应商公司的账户需要登录网站并更新其产品信息,而我们公司内部的用户则可能需要修改产品价格或级别。匿名用户只能浏览数据。这就需要我们的Web程序能够动态地根据访问用户的身份来调整数据的修改能力。
在本教程中,我们将创建一个页面,通过DetailsView控件显示供应商信息,并使用GridView控件列出供应商的产品。对于来自我们公司的用户,他们可以查看和编辑任何供应商的信息;而对于来自特定供应商公司的用户,他们只能查看和编辑自己公司的地址信息,或者修改那些没有缺货的产品信息。
一、理解ASP.NET 2.0的权限体系
ASP.NET 2.0的Membership体系提供了一个创建、管理和验证用户账号的标准平台。虽然本文的重点不在于Membership体系,但我们将假设已通过Membership体系验证了匿名用户,并认定他们属于某个特定的供应商或我们公司。关于Membership的更多信息,建议查阅相关的系列文章。
二、实施权限控制的第一步
在实际Web应用程序中,用户的账号信息通常包含识别用户身份的信息,如他们是否来自我们公司或某个供应商。这种信息可以在用户登录后通过ASP.NET代码进行访问。
在本教程中,我们将采用一种简单的机制来确定用户的访问权限——通过下拉菜单让用户选择他们要查看或修改的供应商信息。用户可以选择查看和修改任何供应商的信息,或者作为供应商只能查看和修改自己的信息。
三、创建DropDownList并填充数据
为了决定用户的访问权限,我们首先需要创建一个DropDownList控件,并填充系统供应商信息数据。打开EditInsertDelete文件夹下的UserLevelAccess.aspx页面,添加一个ID为Suppliers的DropDownList控件,并将其绑定到一个名为AllSuppliersDataSource的ObjectDataSource控件。
由于我们希望DropDownList显示所有供应商的信息,因此配置ObjectDataSource调用SuppliersBLL类中的GetSuppliers()方法。确保ObjectDataSource的Update()方法映射到SuppliersBLL类的UpdateSupplierAddress方法,这个控件将被用于DetailsView控件的数据更新。完成ObjectDataSource的设置后,配置Suppliers下拉框控件,使其每个ListItem显示数据为CompanyName,数据值则为SupplierID。
图4配置Suppliers DropDownList使用CompanyName和SupplierID数据成员展示
至此,我们的DropDownList已经成功列出了数据库中的所有供应商名称。为了让用户更方便地操作,我们决定在下拉框中添加一个“显示/编辑所有供应商”的选项。为此,我们需要启用Suppliers下拉框的AppendDataBoundItems属性,并添加一个新的ListItem。这个ListItem的Text属性设置为“显示/编辑所有供应商”,而value属性设置为-1。这一操作可以通过标记语言的声明或者直接在属性窗口的设计器中完成。
回顾之前的教程《使用DropDownList过滤的主/从报表》,里面详细讨论了如何在下拉框中添加“显示所有”选项。完成上述设置后,我们的DropDownList的声明标记语言如下:
asp:DropDownList ID="Suppliers" runat="server" AppendDataBoundItems="True" DataSourceID="AllSuppliersDataSource" DataTextField="CompanyName" DataValueField="SupplierID">asp:ListItem Value="-1">显示/编辑所有供应商asp:DropDownList>
接下来是图5的介绍,它展示了当前在浏览器中的操作截图。这个图展示了一个包含“Show ALL”选项的Suppliers下拉框,以及其他每一个供应商的详细名称。为了让用户在选择后立即更新用户界面,我们将设置Suppliers下拉框的AutoPostBack属性为true。接下来,我们将创建一个DetailsView控件,用于显示用户选择后的供应商详细信息。在代码中,我们将创建一个下拉框的SelectedIndexChanged事件处理器,根据当前的选择将具体的供应商信息绑定到DetailsView控件中。
第二步是添加DetailsView控件。我们使用DetailsView控件来展示供应商信息。对于拥有查看和编辑所有供应商信息的用户,DetailsView将支持分页并允许逐个查看每个供应商资料。如果用户是某个特定供应商,DetailsView将只显示该供应商的信息且不会包含分页界面。在两种情况下,DetailsView都允许用户编辑所能访问到的供应商的地址、城市和国家等属性。
通过精心配置SupplierDetails的DetailsView控件与AllSuppliersDataSource的ObjectDataSource控件,我们的代码示例展现了一种直观且功能强大的交互方式。让我们深入这个过程。
我们在服务器端设置了一个名为AllSuppliersDataSource的ObjectDataSource控件。这个控件的主要职责是提供供应商数据的来源。它调用SuppliersBLL类的GetSuppliers方法获取所有供应商信息,并且当需要更新供应商地址时,会调用UpdateSupplierAddress方法。更新方法的参数包括供应商ID、地址、城市和国家等信息。
紧接着,我们有一个名为SupplierDetails的DetailsView控件,它与AllSuppliersDataSource数据源相关联。这个控件允许我们展示供应商的详细信息,如公司名称、地址、城市、国家和电话等。重要的是,它还支持分页浏览,这意味着用户可以逐页查看供应商信息。每个供应商信息的旁边都有一个编辑按钮,点击后可以更新供应商的地址信息。这一切如图6所示。
然后,当我们从Suppliers下拉框中选择一个供应商时,我们希望能够只看到这个特定供应商的信息,而不是所有供应商的信息。为了实现这个功能,我们需要在页面上添加另一个ObjectDataSource控件,命名为SingleSupplierDataSource。这个控件将专门用于获取被选择的单个供应商的信息。通过配置这个控件,使其使用SuppliersBLL类的GetSupplierBySupplierID(supplierID)方法,我们可以实现只显示所选供应商信息的功能。与AllSuppliersDataSource一样,SingleSupplierDataSource也支持更新操作,确保所选供应商的详细信息能够被准确更新。
深入配置SingleSupplierDataSource ObjectDataSource控件与运用GetSupplierBySupplierID(supplierID)方法
在Web开发过程中,我们经常需要动态地展示和编辑数据。在本次教程中,我们将深入如何配置SingleSupplierDataSource ObjectDataSource控件,并使用GetSupplierBySupplierID(supplierID)方法来获取特定供应商的信息。
我们需要为GetSupplierBySupplierID(supplierID)方法的supplierID参数指定参数来源。由于我们希望从下拉框选择的供应商来显示信息,因此选择Suppliers下拉框的SelectedValue属性作为参数来源。通过这种方式,我们可以根据用户的选择来动态地获取供应商的信息。
当我们在Suppliers下拉框中选择不同的供应商时,需要相应地调整数据源的使用。为了实现这一功能,我们可以为Suppliers下拉框添加一个SelectedIndexChanged事件的处理器。这个事件处理器将根据用户的选择来决定使用哪个数据源,并重新绑定DetailsView控件的数据。
以下是事件处理器的代码示例:
```csharp
protected void Suppliers_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList suppliers = (DropDownList)sender; //获取下拉框实例
if (suppliers.SelectedValue == "-1") //如果选择了显示所有供应商的选项
{
//设置DetailsView控件的DataSourceID为AllSuppliersDataSource,并重置页面索引
SupplierDetails.DataSourceID = "AllSuppliersDataSource";
SupplierDetails.PageIndex = 0;
}
else //如果用户选择了特定的供应商
{
//设置DetailsView控件的DataSourceID为SingleSupplierDataSource,以显示特定供应商的信息
SupplierDetails.DataSourceID = "SingleSupplierDataSource";
}
//确保DetailsView处于只读模式,并重新绑定数据
SupplierDetails.ChangeMode(DetailsViewMode.ReadOnly);
SupplierDetails.DataBind();
}
```
通过这个事件处理器的逻辑处理,我们的DetailsView控件现在可以根据用户的选择来显示不同的供应商信息。当用户选择“显示/编辑所有供应商”时,所有的供应商信息可以通过分页进行浏览。而当用户选择特定的供应商时,只有该供应商的信息可以被浏览和编辑。这种动态的数据展示方式大大增强了Web应用程序的交互性和用户体验。
在实际应用中,还需要注意确保DropDownList和DetailsView控件的EnableViewState属性设置为true。这是因为在下拉框选择和DetailsView数据源变更时,需要在页面回传时记录这些变化,以保证数据的正确显示和编辑。通过这种方式,我们能够创建一个动态、交互式的Web应用程序,为用户提供更好的数据展示和编辑体验。随着DetailsView控件的完成,我们迎来了关键的步骤:在一个可编辑的GridView中列出供应商信息。这个GridView将专门针对选定的供应商,展示其产品信息,并允许用户编辑特定属性。如果用户拥有相应权限并访问此页面,他们应当能够更新产品数据,尤其是那些没有过时的产品。为了实现这一功能,我们需要对ProductBLL类进行升级,添加一个重载的UpdateProducts方法。这个方法将接收ProductID、ProductName和QuantityPerUnit作为输入参数。在前面的开发中,我们已有类似的操作经验,现在让我们重点关注需要添加到ProductsBLL类的代码部分。
在ProductBLL类中,我们添加了如下重载方法:
```csharp
[SystemponentModel.DataObjectMethodAttribute(
SystemponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, string quantityPerUnit, int productID)
{
// 获取指定产品ID的产品数据表
Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
// 如果没有找到匹配记录,返回false
if (products.Count == 0)
return false;
// 获取第一个产品记录
Northwind.ProductsRow product = products[0];
product.ProductName = productName;
// 如果数量单位为空,则设置为null;否则赋值
if (quantityPerUnit == null)
product.SetQuantityPerUnitNull();
else
product.QuantityPerUnit = quantityPerUnit;
// 更新产品记录
int rowsAffected = Adapter.Update(product);
// 如果恰好更新了一行数据,返回true;否则返回false
return rowsAffected == 1;
}
```
有了这个重载方法,我们可以开始在页面上添加GridView控件和相关ObjectDataSource控件。为页面添加一个GridView控件,设置其ID为ProductBySupplier。然后,配置它使用一个名为ProductBySupplierDataSource的ObjectDataSource控件。由于我们希望通过选择供应商来显示相关的产品信息,因此我们将使用ProductBLL类的GetProductsBySupplierID(supplierID)方法。我们需要将上面添加的重载方法UpdateProduct映射到ObjectDataSource的Update()方法。
(图11)配置ObjectDataSource使用添加的UpdateProduct重载方法。在此步骤中,系统会提示我们选择GetProductsBySupplierID(supplierID)方法的supplierID输入参数的参数源。由于我们想在DetailsView中显示供应商的产品信息,因此选择使用SuppliersDetails这个DetailsView控件的SelectedValue属性作为参数源。
在呈现产品信息的页面上,我们使用了ASP技术中的GridView控件与ObjectDataSource声明标记,其布局与狼蚁网站SEO优化的某些部分有着相似之处。以下是具体的实现细节。
GridView控件用于展示产品信息,其ID为“ProductsBySupplier”。这个控件运行在服务器端,能够自动产生列,并通过DataKeyNames属性将产品ID作为关键数据。数据源则是通过DataSourceID属性与ProductsBySupplierDataSource相关联。在GridView的列定义中,我们添加了命令字段以显示编辑按钮,同时定义了产品名称、单位数量和是否已停止生产等绑定字段。我们也包含了一个复选框字段用于展示产品的已停止生产状态,此字段设置为只读。
与GridView相对应的ObjectDataSource控件,其ID为“ProductsBySupplierDataSource”,运行在服务器端。此数据源用于从后端逻辑获取产品信息并更新产品数据。OldValuesParameterFormatString属性在此被设置为“original_{0}”,用于在更新产品名称和单价时传递旧值参数。这个设置有时可能导致问题,因此我们可以选择移除这个属性或将其设置为默认值"{0}"。
在选择参数部分,我们使用了ControlParameter来从名为“SupplierDetails”的控件中获取供应商ID的值,以此选择对应供应商的产品信息。完成配置后,页面上的GridView能够展示选定供应商的产品信息(如图13所示)。现在,产品的名称和单价都可以进行编辑和更新。
在供应商和用户交互频繁的业务场景中,ProductsBySupplier GridView无疑是一个强大的工具,它为我们的用户提供了对指定供应商产品的全面访问权限。我们的业务规则要求我们不得随意赋予用户更新废弃产品的权限。为此,我们必须根据用户的角色和权限调整GridView的展示逻辑。下面就是我们的实现步骤。
当用户成功访问由特定供应商提供的产品页面时,GridView开始展现各种产品。此时的每一个产品前都有一个编辑按钮。我们不允许用户编辑已经废弃的产品。这就需要我们在RowDataBound事件处理器中进行一系列判断和操作。处理器首先检查用户是否关联到某个特定的供应商,这可以通过Suppliers下拉框的选中值来判断。接着,处理器会检查每个产品是否已经被废弃。这是通过获取绑定到GridView上的ProductRow实例来完成的。一旦确定产品已经废弃,处理器就会隐藏或删除对应的编辑按钮。这样,在界面层面我们就限制了用户编辑废弃产品的行为。这个过程的技术实现细节已经在之前的教程中详细讨论过。
让我们来看看这段代码如何实现这一逻辑:当每一行的数据被绑定到GridView时,我们的处理器就会介入工作。如果用户的操作与特定供应商相关,并且产品已经被标记为废弃,那么对应的编辑按钮就会被隐藏起来。这意味着只有授权的用户才能看到并编辑这些活跃的产品信息。而对于被废弃的产品,只有拥有高级权限的用户才能进行操作。这样一来,我们就确保了数据的安全性和完整性。
我们的业务逻辑层也需要进行相应的调整和优化。例如,在SuppliersBLL类中的GetSuppliers()方法或UpdateSupplierAddress方法中增加适当的检测逻辑。这些检测可以确保只有授权的用户才能访问和操作特定的数据。由于这部分代码无法直接展示在此教程中,我们需要在后续的开发和调试过程中逐步完善和优化这部分逻辑。
通过GridView的展示控制和业务逻辑层的优化调整,我们确保了只有授权的用户才能编辑和操作活跃的产品信息,而被废弃的产品则受到严格的保护和控制。这样的机制不仅提升了数据的安全性,也使得我们的业务操作更加规范和高效。对于用户而言,这种细致的控制使得他们在使用我们的系统时更加便捷和安全。认证模式下用户权限的管理:基于ASP.NET与业务逻辑层的高效实践
在当下数字化时代,许多网站和应用都依赖于用户认证系统来确保数据安全与用户体验。当使用ASP.NET提供的认证模式(如Windows认证)或成员系统时,当前登录用户的信息和角色信息能够通过业务逻辑层轻松访问。在此背景下,无论是表现层还是业务逻辑层,都能进行细致的权限判断与管理。
众多网站根据登录用户身份定制不同的数据修改界面。管理员拥有全面权限,可能删除或编辑任何记录;而对于无管理权限的用户,他们可能仅可更新或删除自己创建的数据。这一过程中,web控件(如数据绑定控件ObjectDataSource)和业务逻辑层的类发挥着重要作用,可以根据登录用户的身份扩展添加、删除功能。本篇教程展示了如何根据用户是否与特定供应商关联,或是是否为公司的成员来限制数据的显示和编辑权限。
在此教程中,我们使用了GridView、DetailsView和FormView等控件来实现数据的添加、更新和删除操作。这些控件为用户提供了直观的操作界面,同时也方便开发者实现后端逻辑。从接下来的教程开始,我们将深入如何添加分页和排序功能,以进一步提升用户体验。
在这些功能的不得不提一下本文的作者Scott Mitchell。作为微软Web技术的资深专家,Scott Mitchell自1998年以来一直应用并研究ASP/ASP.NET技术。他著有多本关于ASP/ASP.NET的书籍,是4GuysFromRolla.的创始人。他还是一个独立的技术咨询顾问、培训师和作家。最近,他完成了由Sams出版社发布的新书《24小时内精通ASP.NET 2.0》。您可以通过他的博客或电子邮件与他联系,获取更多关于ASP.NET的深入知识和实用建议。
编程世界充满了无限可能和挑战,而用户权限管理是其中重要的一环。通过深入理解并应用ASP.NET的认证模式和业务逻辑层,我们可以更好地管理用户权限,提升系统的安全性和用户体验。让我们一起迎接编程的挑战,享受编程的乐趣!祝编程愉快!
编程语言
- 在ASP.NET 2.0中操作数据之二十三:基于用户对修改
- AngularJS中$http的交互问题
- Visual Studio快速开发以及Visual Studio 2010新功能介绍
- 函数中使用require_once问题深入探讨 优雅的配置文
- Yii CDBCriteria常用方法实例小结
- Node.js利用js-xlsx处理Excel文件的方法详解
- react-navigation之动态修改title的内容
- php 根据URL下载远程图片、压缩包、pdf等文件到本
- WebApi+Bootstrap+KnockoutJs打造单页面程序
- React注册倒计时功能的实现
- 基于JS实现导航条之调用网页助手小精灵的方法
- Zend Framework数据库操作技巧总结
- 关于jsp页面使用jstl的异常分析
- php读取qqwry.dat ip地址定位文件的类实例代码
- vux uploader 图片上传组件的安装使用方法
- PHP Streams(流)详细介绍及使用