前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预

ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预

作者头像
小白哥哥
发布于 2018-03-07 03:16:49
发布于 2018-03-07 03:16:49
1.3K00
代码可运行
举报
文章被收录于专栏:技术小讲堂技术小讲堂
运行总次数:0
代码可运行

什么是ASP.NET Profile

  • 可以为每个用户(包括匿名用户)储存信息
  • 通过在Web.config中的配置即可在应用程序中使用
  • 强类型的属性
  • 可以定义属性组
  • 可以通过自定义ProfileProvider来扩充

如何使用ASP.NET Profile

  1. 配置ProfileProvider(可以使用内置的SqlProfileProvider)
  2. 配置Profile的属性
一个使用ASP.NET Profile的示例

首先,运行打开Visual studio 2008命令提示工具(开始——程序——Visual studio 2008——Visual studio Tool)输入指令:aspnet_regsql -A p -sqlexportonly profileset.sql 回车

这样我们就可以在F:\Microsoft Visual Studio\Microsoft Visual Studio 2008\VC下得到一个名为profileset.sql的文件,命令中的“p”就代码ASP.NET 为profile提供的一个数据库的支持

然后我们打开数据库管理器,我电脑里装的Microsoft SQL Server的develop版本,VS2008带的是Express版本,但是在某些功能上限制,比如它限制数据库最大为4G,虽然这在通常情况下已经是够用的了,但是难免我们会遇到一写很大的数据库,比我上回我就遇到一个宝洁公司的一个项目,他的数据库有10G,这种情况下Express版本就有问题了

在数据库管理工具里运行我们刚才得到的SQL文件,我们最好使用数据库的最高权限管理员登陆,以免遇到一些权限上的问题

然后我们会在数据库里发现一个名为aspnetdb的数据库,这个数据库是默认生成的,名字可以是在我们开始使用命令行的时候指定的,

打开这个数据库,我们可以看到四个表(除系统表以外)aspnet_Applications、aspnet_Profile、aspnet_SchemaVersions、aspnet_Users,这些数据表,按照他的名字,我们就可以猜到它的用途啦

然后打开VS中的web.config,在<configuration>节点下添加connectionStrings节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<connectionStrings>
        <add name="ProfileDatabase" connectionString="Data Source=XIAOYAOJIAN;Initial Catalog=aspnetdb;Persist Security Info=True;User ID=sa;Password=*******"/>
    </connectionStrings>

这个就不多做解释了,学过asp.net的人,估计没一个不明白这个的意思吧

然后,在system.web节点下,添加如下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<profile enabled="true" defaultProvider="SqlProvider">
            <providers>
                <clear/>
        <!--type表示我们使用的ProfileProvider的类型,connectionStringName指定我们上面配置的connectionString,applicationName表示应用程序的名字,将会体现的数据库中-->
                <add name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ProfileDatabase" applicationName="ProfileSample" description="Sample for ASP.NET profile and Profile Service"/>
            </providers>
      <!--配置属性-->
            <properties>
        <!--定义属性,并指定类型-->
                <add name="Name" type="System.String"/>
                <add name="Email" type="System.String"/>
                <add name="Age" type="System.Int32"/>
        <!--定义一个属性组-->
                <group name="Address">
                    <add name="City" type="System.String"/>
                    <add name="Street" type="System.String"/>
                    <add name="PostalCode" type="System.String"/>
                </group>
            </properties>
        </profile>

这里需要注意一点,在每个属性中都有一个allowAnonymous属性,指定是否可为匿名用户使用,默认是false,如果设置为true,则它也可以为一些匿名用户存储一些信息

接下来我们就可以创建也一个页面使用它

前台代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProfileUsage.aspx.cs" Inherits="Demo08_ProfileUsage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TextBox ID="txtUsername" runat="server"></asp:TextBox>
        <asp:Button ID="btnLogInOut" runat="server" Height="24px" Text="btnLogIn/Out" Width="113px"
            OnClick="btnLogInOut_Click" />
        <hr />
        Name:<asp:TextBox ID="txtName" runat="server"></asp:TextBox><br />
        Age:<asp:TextBox ID="txtAge" runat="server"></asp:TextBox><br />
        Email:<asp:TextBox ID="txtEmail" runat="server"></asp:TextBox><br />
        City:<asp:TextBox ID="txtCity" runat="server"></asp:TextBox><br />
        Street:<asp:TextBox ID="txtStreet" runat="server"></asp:TextBox><br />
        Postal Code:<asp:TextBox ID="txtPostalCode" runat="server"></asp:TextBox><br />
        <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label><br />
        <asp:Button ID="btnShowProfile" runat="server" Text="Show" OnClick="btnShowProfile_Click" />
        <asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" />
    </form>
</body>
</html>

后台代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

public partial class Demo08_ProfileUsage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnLogInOut_Click(object sender, EventArgs e)
    {
        if (this.User.Identity.IsAuthenticated)
        {
            this.lblMessage.Text = this.User.Identity.Name + " logout!";
            FormsAuthentication.SignOut();//注销用户
        }
        else
        {
            this.lblMessage.Text = this.txtUsername.Text + " login!";
            FormsAuthentication.SetAuthCookie(this.txtUsername.Text, false);//使用户登陆
        }
    }
    protected void btnShowProfile_Click(object sender, EventArgs e)
    {
        if (this.Profile.Age == 0)//没有profile,这是个不完整的做法,我们只做一个示例用
        {
            this.txtName.Text = "";
            this.txtEmail.Text = "";
            this.txtCity.Text = "";
            this.txtAge.Text = "";
            this.txtPostalCode.Text = "";
            this.txtStreet.Text = "";

            this.lblMessage.Text = this.User.Identity.Name + " No profile!";
        }
        else
        {
            this.txtName.Text = this.Profile.Name;
            this.txtEmail.Text = this.Profile.Email;
            this.txtCity.Text = this.Profile.Address.City;
            this.txtAge.Text = this.Profile.Age.ToString();
            //使用属性组中的内容
            this.txtPostalCode.Text = this.Profile.Address.PostalCode;
            this.txtStreet.Text = this.Profile.Address.Street;

            this.lblMessage.Text = this.User.Identity.Name + " profile loaded!";
        }
    }
    protected void btnSave_Click(object sender, EventArgs e)
    {
        this.Profile.Name = this.txtName.Text;
        this.Profile.Age = Int32.Parse(this.txtAge.Text);
        this.Profile.Email = this.txtEmail.Text;
        this.Profile.Address.City = this.txtCity.Text;
        this.Profile.Address.Street = this.txtStreet.Text;
        this.Profile.Address.PostalCode = this.txtPostalCode.Text;

        this.lblMessage.Text = this.User.Identity.Name + "  profile saved!";
    }
}

验证页面,首先在第一个文本框中属于一个用户名(随意的),点击登陆,输入个人信息,点击SAVE,就可以保存关于这个用户的信息,点击Logout,然后点击SHOW,显示NO PROFILE,然后再登陆刚才那个用户,点击SHOW,则显示个人信息

打开数据库aspnetdb中的aspnet_Applications表,可以看到类似如下内容

在这里我们可以找到我们配置的ApplicationName

然后打开aspnet_Users表,会看到类型如下内容

这里能找到上一个表的ApplicationId,UserName,IsAnonymous等一系列信息这就是我们通过profile设置进来的

保存信息的表,则是存放在了aspnet_Profile这个表里,打开我们可以找到几中存储的方式,可以模糊的看到我们存储的信息,因为它已经通过一种它的规则把它进行了序列化,我们不需要也没必要去读懂它

Profile Service

  • ASP.NET AJAX 1.0提供的Application Service中的一个
  • 另一个是Membership Service
  • .NET Framework 3.5中包含其他的Application Service

使用Profile Service

  • 出于安全性考虑,ASP.NET AJAX的Profile Service在默认情况下是不可用的
  • <profile Service enabled=”true|false" readAccessProperties="prop1,prop2,…" writeAccessProperties="prop1,prop2,…"  />

加载Profile Service

Sys.Services.ProfileService.load(propertyNames,//需要加载的Profile名,null表示全部

loadCompletedCallback,//加载成功的回调函数

failedCallback,//加载失败的回调函数

userContext//可以随意设置的上下文对象

);

function loadCompletedCallback(

number,//本次加载的Profile数量

userContext,//用户随意指定的上下文对象

methodName//即Sys.Services.ProfileService.load

){…}

function failedCallback(

error,//错误对象

userContext,//用户随意指定的上下文对象

methodName//即Sys.Services.ProfileService.load

){…}

获取和修改Profile Service

var properties=Sys.Services.ProfileService.properties;

alert(properties.Name);

alert(properties.Address.City);

……

properties.Address={City:"tianjin",Street:"yashen road",PostalCode:"300350"};

properties.Save(…);

保存Profile Service

Sys.Services.ProfileService.save(

propertyNames,//需要保存的Profile名,null表示全部

saveCompletedCallback,//保存成功的回调函数

failedCallback,//加载失败的回调函数

userContext//这个,还用写吗?

);

function saveCompletedCallback(

number,//本次加载的Profile数量

userContext,

methodName//即Sys.Services.ProfileService.save

){…}

function failedCallback(

error,//错误对象

userContext,

methodName//即Sys.Services.ProfileService.save

){…}

一个使用Proile Service的示例

创建一个名为ProfileService.aspx的页面

前台代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProfileService.aspx.cs" Inherits="Demo08_ProfileService" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script language="javascript" type="text/javascript">
        function loadProfiles() {
            Sys.Services.ProfileService.load(null, loadCompleted);
        }

        function loadCompleted() {
            var properties = Sys.Services.ProfileService.properties;
            if (properties.Age) {//如果有Profile
                $get("txtName").value = properties.Name;
                $get("txtAge").value = properties.Age;
                $get("txtCity").value = properties.Address.City;
                $get("txtPostalCode").value = properties.Address.PostalCode;
                $get("message").innerHTML = "Profile loaded!";
            }
            else {
                $get("txtName").value = "";
                $get("txtAge").value = "";
                $get("txtCity").value = "";
                $get("txtPostalCode").value = "";
                $get("message").innerHTML = " No Profile";
            }
        }

        function saveProfiles() {
            var properties = Sys.Services.ProfileService.properties;
            properties.Name = $get("txtName").value;
            properties.Age = parseInt($get("txtAge").value, 10);
            properties.Address.City = $get("txtCity").value;
            properties.Address.PostalCode = $get("txtPostalCode").value;

            Sys.Services.ProfileService.save(null,saveCompleted);
        }
        function saveCompleted() {
            $get("message").innerHTML = "profile saved";
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
            
        </asp:ScriptManager>
        
        <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
        <asp:Button ID="btnLogIn" runat="server" Text="Login" OnClick="btnLogin_Click" />
        <asp:Button ID="btnLogout" runat="server" Text="Logout" OnClick="btnLogout_Click" />
        <hr />
        
        Name: <input type="text" id="txtName" /><br />
        Age: <input type="text" id="txtAge" /><br />
        Email: <input type="text" id="txtEmail" /><br />
        City: <input type="text" id="txtCity" /><br />
        Street: <input type="text" id="txtStreet" /><br />
        Postal Code: <input type="text" id="txtPostalCode" /><br />
        
        <div id="message" style="color:Red;"></div><br />
        
        <input type="button" value="Show" onclick="loadProfiles()" />
        <input type="button" value="Save" onclick="saveProfiles()" />
    </form>
</body>
</html>

后台代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

public partial class Demo08_ProfileService : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
    }
    protected void btnLogin_Click(object sender, EventArgs e)
    {
        FormsAuthentication.SetAuthCookie(this.txtUserName.Text, false);
    }
    protected void btnLogout_Click(object sender, EventArgs e)
    {
        FormsAuthentication.SignOut();
    }
}

然后我们打开web.config进行配置,找到<system.web.extensions>下的<scripting>下的<webServices>,增加以下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--这里不可以直接写一个属性组,而要把属性组里的属性一一列举出来-->
        <profileService enabled="true" readAccessProperties="Name,Age,Email,Address.City,Address.Street,Address.PostalCode" writeAccessProperties="Name,Age,Email,Address.City,Address.Street,Address.PostalCode"/>

这样,使用方式和之前的一样,但是我们就使用AJAX的方式使用了Profke Service

其他的一些Profile Service属性

  • timeout属性:设置超时时间(Sys.Services.ProfileService.get_timeout()/set_timtout();)
  • defaultLoadCompletedCallback属性
  • defaultSaveCompletedCallback属性
  • defaultFailedCallback属性

Profile Service预加载

AJAX技术是很容易被滥用的,因为我们在对网页进行操作的时候,随便的一鼠标划过效果,可能就会产生一个Round-trip,如果设计上有滥用,则会很大程序上增加了服务端的压力,而且如果设计的不好,有时候不旦没有提高用户体验,反而是降低了,还有呢,就是一个安全性的问题,这个以后会写到,所以就要在合适的时候使用预加载,来减少这种Round-trip

Profile Service预加载的方式就是在ScriptManager中做的一些操作

如果我们要使用这个功能,很简单,只需要在<ScriptManager>中添加类似如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ProfileService LoadProperties="Name, Email, Address.City, Address.Street" />

Profile Service实现方式

Profile Service的功能

  • 使用AJAX方式获取Profile
  • 使用AJAX方式保存Profile

如果没有这个Profile Service,我们要做这些事情,则需要在客户端调用一个Web Service,事实上Profile Service它的内部实现就是这样的,他是对客户端执行服务器端方法给出的一种特殊实现,在调用定义的ASP.NET AJAX程序集上的ProfileService类,最终工作的为以下的三个方法

  • GetAllPropertiesForCurrentUser
  • GetPropertiesForCurrentUser
  • SetPropertiesForCurrentUser

晚二十点二十七

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-10-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET AJAX(3)__UpdatePanel
今天也不知道写不写的完了,最近闲下来了,却感冒了,早上起来都不会说话了,不过幸亏咱不是靠嘴皮子过活了,哎~~~~窃喜吧 上一篇简单写到UpdatePanel的一些好处和坏处,这一篇呢,就细致的认识一下UpdatePanel这个控件,并合理的使用它 UpdatePanel的一些属性 : RenderMode     __Block(默认值):设定UpdatePanel使用DIV来圈出要跟新的区域     __Inline:设定UpdatePanel使用span来。。。。。。 UpdateMode  
小白哥哥
2018/03/07
4.9K0
ASP.NET AJAX(3)__UpdatePanel
ASP.NET AJAX(10)__Authentication ServiceAuthentication ServiceAuthentication Service属性Authentication
在通常情况下,如果使用AJAX方式调用WebService,则可能被恶意用户利用,造成性能以及安全性的问题,所以我们需要使用一些验证方式来保护WebService,最常见方式就是Forms Authentication,这也是一种用法很简单的方式 一个使用FormsAuthentication保护WebService调用的示例 首先创建一个名为ProtectedService的WebService,代码如下 using System; using System.Collections.Generic; us
小白哥哥
2018/03/07
1.8K0
ASP.NET AJAX(13)__利用Microsoft AJAX Library开发客户端组件Sys.Component成员Sys.IDisposable成员Sys.INotifyDisposin
Microsoft AJAX Library定义了一个客户端组件的模型,它的基类是Sys.Component,它实现了三个接口Sys.IDisposable,Sys.INotifyDisposing,Sys.INotifyPropertyChange Sys.Component成员 get_events() get_id(); set_id(); get_isInitialized(); initialize(); dispose(); raisePropertyChanged(); Sys.IDispos
小白哥哥
2018/03/07
3.1K0
ASP.NET AJAX(13)__利用Microsoft AJAX Library开发客户端组件Sys.Component成员Sys.IDisposable成员Sys.INotifyDisposin
UpdatePanel的简单用法(非嵌套)「建议收藏」
ScriptManager和UpdatePanel控件联合使用可以实现页面局部异步刷新的效果。UpdatePanel用来设置页面中局部异步刷新的区域,它必须依赖于ScriptManager,因为ScriptManager控件提供了客户端脚本生成与管理UpdatePanel的功能。
全栈程序员站长
2022/09/15
9670
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET 2.0的主题和皮肤特性使你能够把样式和布局信息存放到一组独立的文件中,总称为主题(Theme)。接下来我们可以把这个主题应用到任何站点,用于改变该站点内的页面和控件的外观和感觉。通过改变主题的内容,而不用改变站点的单个页面,就可以轻易地改变站点的样式。主题也可以在开发者之间共享。
Java架构师必看
2021/03/22
3.5K0
ASP.NET AJAX(8)__Microsoft AJAX Library中异步通信层的使用什么是异步通信层Micorsoft AJAX Library异步通信层的组成WebRequestExec
什么是异步通信层 Microsoft AJAX Library的组长部分之一 负责ASP.NET AJAX框架中所有的客户端与服务器端的通信 其默认实现了封装了XMLHttpRequest的功能 一个使用XMLHttpRequest发出AJAX请求的示例 创建一个名为RandomNumber.ashx的一般处理程序 <%@ WebHandler Language="C#" Class="RandomNumber" %> using System; using System.Web; public cla
小白哥哥
2018/03/07
2.1K0
ASP.NET保持用户状态的九种选择
摘要:ASP.NET为保持用户请求之间的数据提供了多种不同的途径。你可以使用Application对象、cookie、hidden fields、Sessions或Cache对象,以及它们的大量的方法。决定什么时候使用它们有时很困难。本文将介绍了上述的技术,给出了什么时候使用它们的一些指导。尽管这些技术中有些在传统ASP中已经存在,但是有了.NET框架组件后该在什么时候使用它们发生了变化。为了在ASP.NET中保持数据,你需要调整从先前的ASP中处理状态中学习到的知识。
Java架构师必看
2021/03/22
1.9K0
asp.net 2.0中一次性更新所有GRIDVIEW的记录
在asp.net 2.0中,gridview控件是十分不错的控件。有的时候,可能一个GRIDVIEW控件中
Java架构师必看
2021/03/22
1.1K0
asp.net(c#)网页跳转几种方法小结「建议收藏」
在asp.net下,经常需要页面的跳转,下面是具体的几种方法。跳转页面是大部编辑语言中都会有的,正面我们来分别介绍一下关于.net中response.redirect sever.execute server.transfer 三种页面跳转的方法
全栈程序员站长
2022/09/09
2.4K0
ASP.NET-WebFoms常见前后端交互方式
在 ASP.NET Web Forms 中,实现前后端交互是开发 Web 应用程序的重要部分。通过合适的数据传递方式,前端页面能够与后端进行有效的通信,并实现数据的传递、处理和展示。本文介绍了ASP.NET Web Forms开发中常见的前后端交互方式,包括控件绑定、Ajax、WebService、自定义处理程序和Form提交等。通过详细解读每种方式的特点、使用方法和示例代码,读者可以全面了解各种方式的优缺点以及适用场景。这些方法为实现前后端数据交互提供了灵活多样的选择,有助于开发者根据项目需求选择最合适的方式进行开发。
Damon小智
2024/03/16
5320
ASP.NET-WebFoms常见前后端交互方式
在asp.net中为Web用户控件添加属性和事件
在90年代初,Microsoft为Web程序员提供的ActiveServerPages(ASP运维
Java架构师必看
2020/10/15
2.5K0
资料验证的asp.net程序
Validator(资料验证)控制元件Email:ControlToValidate=EmailC#
Java架构师必看
2021/03/22
1.9K0
Asp.Net 用户验证(自定义IPrincipal和IIdentity)
前一段时间有两个朋友问我,为什么在HttpModule中无法获得到Session值,因为他们希望自定义一个HttpModule,然后在其中获取Session来进行用户验证。我奇怪为什么不使用.Net Framework已经提供的验证机制,而要和Asp时一样,自己手工进行cookie+Session验证?我们是基于.Net Framework这个平台进行编程,所以我觉得,在很多情况下,使用Framework已经建立好的机制会显著地提高工作效率,而且.NET Framework内置的验证机制通常也更加安全。
张子阳
2018/09/30
1.7K0
Asp.Net 用户验证(自定义IPrincipal和IIdentity)
.net中的认证(authentication)与授权(authorization)
注:这篇文章主要给新手看的,老手们可能会觉得没啥营养,就请绕过吧。 “认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 认证(authentication) 就是 "判断用户有没有登录?"
菩提树下的杨过
2018/01/23
1.8K0
.net中的认证(authentication)与授权(authorization)
Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由
以前在做asp的时候,要把 /default.asp?id=123映射成/default/123,需要借助IISRewriter这个组件,到了asp.net以后,可以用代码写了,但是个人觉得很麻烦,要
菩提树下的杨过
2018/01/22
7440
Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由
asp:UpdatePanel客户端回传事件管理
Asp:UpdatePanel是在Asp.Net WebForm中的一个局部刷新控件,虽然很好用,但是在使用过程中却发现如果局部刷新的数据需要再次使用页面js进行格式化,页面则会乱套,所以在这里我们需要对UpdatePanel的回传过程进行控制。
全栈程序员站长
2022/09/15
3.6K0
ASP.NET中 RangeValidator(范围验证)的使用[通俗易懂]
1,ControlToValidate:要验证的控件 2,ErrorMessage:错误提示信息 3,MaximumValue:最大值 4,MinimumValue:最小值 4,Type:Integer【整数型】;Date【日期】;Double【双精度浮点型】;String【字符串型】;Currency[货币类型]
全栈程序员站长
2022/09/07
1.8K0
ASP.NET中 RangeValidator(范围验证)的使用[通俗易懂]
ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
我想对于ASP.NET的Validator控件已经熟悉的不能再熟悉了。我们 已经习惯了用Validator控件来验证我们在表单的输入,并通过ValidationSummary来输出我们为Validator控件设置的Error message。不知道大家有没想过进一步改进一下我们的Validation来改善我们的User Experience。比如,在ValidationSummary输出一个Link连接到对应的控件,而不是显示单纯的Error message。 比如在上图中,是一个典型的Logi
蒋金楠
2018/02/07
2.7K0
ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
ASP.NET 2.0页面框架的几处变化
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
1.4K0
ASP.NET AJAX(4)__客户端访问WebService服务器端释放WebService方法客户端访问WebService客户端访问PageMethod错误处理复杂数据类型使用基础客户端代理的
服务器端释放WebService方法 编写一个普通的WebService 为WebService类添加自定义的属性标记__ScriptServiceAttribute 释放WebService方法                   __访问级别为Public                   __使用WebServiceAttribute进行标记 为页面中的ScriptManager引入asmx文件 客户端访问WebService [Namespaces.]ClassName.MethodName 依次
小白哥哥
2018/03/07
4.9K0
推荐阅读
相关推荐
ASP.NET AJAX(3)__UpdatePanel
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验