10月 23

服务器是 win2008 r2 +iis 7.5

开发用的mvc5

一直报错 

重新注册

%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i

各种折腾都不行,抓狂了  

最后居然是

添加 global.asax解决问题. 

written by ocean

10月 10

IIS里面限制,需要做调整

位置在 

IIS–>Request Filtering–>Edit Feature Settings

修改Maximum allowed content length

默认值是30M

written by ocean

9月 19

做了一个公司项目,里面有用到一些验证吗,使用的是Attribute的方式

在此记录一下遇到的方式

 

最常见的不允许空

        [Required(ErrorMessage = "The UserName field is required.")]
        public string UserName { get; set; }

 

使用正则验证邮件地址

        [RegularExpression(@"^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]+$", ErrorMessage = "Incorrect email address.")]
        public string Email { get; set; }

 

验证长度

        [StringLength(16, MinimumLength = 8)]
        [Required(ErrorMessage = "The Password field is required.")]
        [Remote("CheckPassword", "Auth", ErrorMessage = "The password must have minimum 8 characters which consist 3 of number,capital, small letter and symbol.")]
        public string Password { get; set; }

这里还使用了Remote验证,用来做一些需要后台处理的特别的验证,这里用来检验密码强度。

其中Auth位Controller,CheckPassword是Action名字

后台代码如下

        public ActionResult CheckPassword(string password)
        {
            //字符统计
            int number = 0, lower = 0, upper = 0, symbol = 0;
            if (password != null && password.Length > 0)
            {
                foreach (char c in password)
                {
                    if (c >= '0' && c <= '9') number = 1;
                    else if (c >= 'a' && c <= 'z') lower = 1;
                    else if (c >= 'A' && c <= 'Z') upper = 1;
                    else symbol = 1;
                }
            }
            var result = false;
            if (number + lower + upper + symbol >= 3) //包含三种
            {
                result = true;
            } 
            return Json(result, JsonRequestBehavior.AllowGet);
        }

 

另外密码确认还用到了Compare

        [DataType(DataType.Password)]
        [System.ComponentModel.DataAnnotations.Compare("Password")]
        [Required(ErrorMessage = "The Confirm Password field is required.")]
        [Display(Name = "Confirm Password")]
        public string ConfirmPassword { get; set; }

这里面的参数就是要校验一致的字段名

Display则是用来做前台显示用。

written by ocean \\ tags:

8月 16

出于对数据库安全性的考虑,对数据库连接字符串进行加密(若防止普通用户了解,当然方法很多)

 

使用aspnet_regiis

路径

C:\Windows\Microsoft.NET\Framework\v4.0.30319

命令

aspnet_regiis -pef connectionStrings  "D:\Work\Ascend.EVoucher\Ascend.EVoucher.UI"

加密前

  <connectionStrings>
    <add name="default" providerName="System.Data.SqlClient" connectionString="Data Source=172.28.3.20;Initial Catalog=tb_rms;Persist Security Info=True;User ID=sa;Password=abc123;MultipleActiveResultSets=True" />
    <add name="EF" connectionString="metadata=res://*/EFModel.csdl|res://*/EFModel.ssdl|res://*/EFModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=172.28.3.20;initial catalog=tb_rms;persist security info=True;user id=sa;password=abc123;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

加密后

    <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">

    <EncryptedData Type="
http://www.w3.org/2001/04/xmlenc#Element
"

      xmlns="
http://www.w3.org/2001/04/xmlenc
#">

      <EncryptionMethod Algorithm="
http://www.w3.org/2001/04/xmlenc#tripledes-cbc
" />

      <KeyInfo xmlns="
http://www.w3.org/2000/09/xmldsig
#">

        <EncryptedKey xmlns="
http://www.w3.org/2001/04/xmlenc
#">

          <EncryptionMethod Algorithm="
http://www.w3.org/2001/04/xmlenc#rsa-1_5
" />

          <KeyInfo xmlns="
http://www.w3.org/2000/09/xmldsig
#">

            <KeyName>Rsa Key</KeyName>

          </KeyInfo>

          <CipherData>            

    <CipherValue>X6D2LyAefKanyqYSooYbyWPqmpg4C7NLALZxXXXGiuAsAKsSm5sSs/al36VyNmK0PK2zolANXMWpIzk6Rgv4QMUGvjHnBH+KLpOWux0N07upEJTp6eYISN3lVBUGSNTU3kJPKPHlaEefY09q8xnKpUj9c5Rvu/qf7NLZE0hmNEY07GoG2gx18zwN4pP0a/d4beZXax6/gzGozVLCYvJ/FahtjPodynW/a7A9leXdcuHjSo5nN7ntndREy1lv1DyJjZUqiSS2Au8ArUWQeYJRdzSYr1ZykmqEeZEcR0EfPw4CN7TUVcce64Uc2xbeL6cW2Wdf1fRJKh1COHjXtlMwzQ==

    </CipherValue>

          </CipherData>

        </EncryptedKey>

      </KeyInfo>

      <CipherData>

        <CipherValue>zaO+PjIPa2J8Jox6DtiqUjy32hQIvYZIFj6DftHMdv5S3fsjoshDYKsgjMFZuyWm9NgoEb0QI5mOVOJ9p0QWipdZpnn+BUI4RqdbwtuhB2ocyLuVZlzmDVqwYM6HG2NJW0GK8RxGcEUQ72ug+YkYWNVceH6DkgoHDJDG2qESVg3v4Xeo/FuEdvbQBnxibQoBsm626m5Yy3f9sAvc2ShkfFTKkqYXMm0S630tBbcLX8RY0no+XZmtU0civtO+dzrLc8H6MVw6SH+l6WxNrCPY/olr3TFgXxvCyuJU3NGjXrKXdmhWreTr5xfjjf2t+cr+16ug817YdV8z1qoEMNU2SuKd+PKxb1rg0YdpPWQLb0ym2dfU69tXrPCcwrupjQZpJ8fOZKQPyEGlxY+jv4VKAb8GvLQSugTcYJ9JAJYr10tghtHnDAvi76n++sHlzJl12vebZygvT8WRnoXL42ONc/1MAy6l6/yI7ZjbaUk8H152/LeJxq5slnPLgCOp8oGEAKX6MmriQmsZM9xtoRMBK6x1Z9ET6K6xCnTQTGtUN9uOwAJ2rE3PeI1FY5Z1YKFOMBQjH3O47k+zBpPusYUkoRphqK55ckT2KuqwedfvtpvdHgRHQElGxCjygeHMtKzs25lkt0bZWPAmdpjxVW3witlq/RsqKHlBxJ2EeGp9//XOjHe6nQPxFGF6urvr/d5arZJ3GGfBz18MvNx4KeYfZu7+JujKkC6jzJOM4Vk6sGMKYn/C8Tn/Jj6VEmO1bld9zR8m0bK4aaak0kQY+sngijBb+Ni2h5KpDmR8K3fcm/dGeh6Uz+wm4TKPVJl6K+FmFi9lDC1kHu8YSv+yvOJzLw==</CipherValue>

      </CipherData>

    </EncryptedData>

  </connectionStrings>

解密命令

aspnet_regiis -pef connectionStrings  
"D:\Work\Ascend.EVoucher\Ascend.EVoucher.UI"

written by ocean

5月 25

程序本地跑的很好,结果一上服务器就提示错误

System.Web.HttpRequestValidationException
A potentially dangerous Request.Form value was detected from the client (html="<!doctype html>...").
Description: HTTP 500.Request validation detected a potentially dangerous input value from the client and aborted the request. This might be an attemp of using cross-site scripting to compromise the security of your site. You can disable request validation using the 'validateRequest=false' attribute in your page or setting it in your machine.config or web.config configuration files. If you disable it, you're encouraged to properly check the input values you get from the client

以前是asp.net webform的时候,解决方法是在页头加

ValidateRequest="false"

在web.config文件加配置

<system.web >
<pages validateRequest="false" ></pages > 
</system.web >

这样就解决了。

如果是.net framework 2.0以上版本需要加

<system.web >
<httpRuntime requestValidationMode="2.0" / >
</system.web >

 

 

 

做了mvc之后,一般用Unvalidated就可以,例如以下

            model.Html = Request.Unvalidated["html"];
            model.XPath = Request.Unvalidated["xpath"];

结果传到服务器还不行,查了一下,在action添加attrubte

        [ValidateInput(false)]
        public ActionResult Xpath(){
            //..
        }

结果还不行,还要在web.config加说明

<system.web >
<httpRuntime requestValidationMode="2.0" / >
</system.web >

终于可以了   

written by ocean

4月 25

ASP.NET Membership是一套系统自带的身份验证机制。不过我很少有用到过。

接手公司的一个老项目,身份验证就用的这个东西,好不容易配好环境,一个login页面进不去。

看了下数据库里面密码是加密过的,而且还加盐了,找了找方法,有个重设密码的函数

        string username = "admin";
        string password = "123456";
        MembershipUser muu = Membership.GetUser(username);
        //uname为要修改用户的帐号
        string p = muu.ResetPassword();
        //将用户密码重置为一个自动生成的新密码
        muu.ChangePassword(p, password);

用这个就改掉了

 

另外记录一下对应的结果  下次就可以直接改库了,前提是没有其他鉴定机制

密码:123456

加密的密码:LZcpR2zvoNnj3pL7dzoTpg==

盐:PENW+0j2M3UbWv62iXEwZQ==

written by ocean

10月 11

以前在做webform的时候,url控制都是自己在httphandler里面写的

打算新开一个站,用mvc的方式,因为规划有多个二级域名,而不是子目录,所以研究了一下mvc的路由配置方式,特此记录

配置形式如下

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


            routes.Add("weixin", new DomainRoute("weixin.zuotu5.com", "{action}", new { controller = "WeiXin", action = "Index" }));
            routes.Add("zhifubao", new DomainRoute("zhifubao.zuotu5.com", "{action}", new { controller = "ZhiFuBao", action = "Index" }));
            routes.Add("qq", new DomainRoute("qq.zuotu5.com", "{action}", new { controller = "QQ", action = "Index" }));
            routes.Add("tucao", new DomainRoute("tucao.zuotu5.com", "{action}", new { controller = "PeiZi", action = "Index" }));
            routes.Add("www", new DomainRoute("zuotu5.com", "{action}", new { controller = "WWW", action = "Index" }));

        }
    }

如此,便配置了5个二级域名

其中用到了类DomainRoute,

    public class DomainRoute : Route
    {
        private Regex domainRegex;
        private Regex pathRegex;

        public string Domain { get; set; }

        public DomainRoute(string domain, string url, RouteValueDictionary defaults)
            : base(url, defaults, new MvcRouteHandler())
        {
            Domain = domain;
        }

        public DomainRoute(string domain, string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
            : base(url, defaults, routeHandler)
        {
            Domain = domain;
        }

        public DomainRoute(string domain, string url, object defaults)
            : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
        {
            Domain = domain;
        }

        public DomainRoute(string domain, string url, object defaults, IRouteHandler routeHandler)
            : base(url, new RouteValueDictionary(defaults), routeHandler)
        {
            Domain = domain;
        }

        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            // 构造 regex
            domainRegex = CreateRegex(Domain);
            pathRegex = CreateRegex(Url);

            // 请求信息
            string requestDomain = httpContext.Request.Headers["host"];
            if (!string.IsNullOrEmpty(requestDomain))
            {
                if (requestDomain.IndexOf(":") > 0)
                {
                    requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));
                }
            }
            else
            {
                requestDomain = httpContext.Request.Url.Host;
            }
            string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;

            // 匹配域名和路由
            Match domainMatch = domainRegex.Match(requestDomain);
            Match pathMatch = pathRegex.Match(requestPath);

            // 路由数据
            RouteData data = null;
            if (domainMatch.Success && pathMatch.Success)
            {
                data = new RouteData(this, RouteHandler);

                // 添加默认选项
                if (Defaults != null)
                {
                    foreach (KeyValuePair<string, object> item in Defaults)
                    {
                        data.Values[item.Key] = item.Value;
                        if (item.Key.Equals("area") || item.Key.Equals("Namespaces"))
                        {
                            data.DataTokens[item.Key] = item.Value;
                        }
                    }
                }

                // 匹配域名
                for (int i = 1; i < domainMatch.Groups.Count; i++)
                {
                    Group group = domainMatch.Groups[i];
                    if (group.Success)
                    {
                        string key = domainRegex.GroupNameFromNumber(i);

                        if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
                        {
                            if (!string.IsNullOrEmpty(group.Value))
                            {
                                data.Values[key] = group.Value;
                                if (key.Equals("area"))
                                {
                                    data.DataTokens[key] = group.Value;
                                }
                            }
                        }
                    }
                }

                // 匹配路径
                for (int i = 1; i < pathMatch.Groups.Count; i++)
                {
                    Group group = pathMatch.Groups[i];
                    if (group.Success)
                    {
                        string key = pathRegex.GroupNameFromNumber(i);

                        if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
                        {
                            if (!string.IsNullOrEmpty(group.Value))
                            {
                                data.Values[key] = group.Value;
                                if (key.Equals("area"))
                                {
                                    data.DataTokens[key] = group.Value;
                                }
                            }
                        }
                    }
                }
            }

            return data;
        }

        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            return base.GetVirtualPath(requestContext, RemoveDomainTokens(values));
        }

        public DomainData GetDomainData(RequestContext requestContext, RouteValueDictionary values)
        {
            // 获得主机名
            string hostname = Domain;
            foreach (KeyValuePair<string, object> pair in values)
            {
                if (pair.Key == "area" && string.IsNullOrEmpty(pair.Value.ToString()))
                {
                    hostname = hostname.Replace("{" + pair.Key + "}", "www");
                }
                else
                {
                    hostname = hostname.Replace("{" + pair.Key + "}", pair.Value.ToString());
                }
            }

            //如果域名的area还没有被替换,说明路由数据里没有area,恢复为顶级域名
            if (hostname.Contains("{area}"))
            {
                hostname = hostname.Replace("{area}", "www");
            }

            RemoveDomainTokens(values);

            // Return 域名数据
            return new DomainData
            {
                Protocol = "http",
                HostName = hostname,
                Fragment = ""
            };
        }

        private Regex CreateRegex(string source)
        {
            // 替换
            source = source.Replace("/", @"\/?");
            source = source.Replace(".", @"\.?");
            source = source.Replace("-", @"\-?");
            source = source.Replace("{", @"(?<");
            source = source.Replace("}", @">([a-zA-Z0-9_]*))");

            return new Regex("^" + source + "$");
        }

        private RouteValueDictionary RemoveDomainTokens(RouteValueDictionary values)
        {
            Regex tokenRegex = new Regex(@"({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?");
            Match tokenMatch = tokenRegex.Match(Domain);
            for (int i = 0; i < tokenMatch.Groups.Count; i++)
            {
                Group group = tokenMatch.Groups[i];
                if (group.Success)
                {
                    string key = group.Value.Replace("{", "").Replace("}", "");
                    if (values.ContainsKey(key))
                        values.Remove(key);
                }
            }

            return values;
        }
    }

    public class DomainData
    {
        public string Protocol { get; set; }
        public string HostName { get; set; }
        public string Fragment { get; set; }
    }

written by ocean \\ tags:

5月 20

ASP.NET Web API(本文简称Web API),是基于ASP.NET平台构建RESTful应用程序的框架。可以说 Web API 就是为在.NET平台下构建RESTful应用程序而生的。

协议

public class Contact
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string PhoneNo { get; set; }
    public string EmailAddress { get; set; }
    public string Address { get; set; }
}

ContactsController  

public class ContactsController : ApiController
{
  
  
    static List<Contact> contacts;
    static int counter = 2;
  
    static ContactsController()
    {
        contacts = new List<Contact>();
        contacts.Add(new Contact
        {
            Id = "001",
            Name = "张三",
            PhoneNo = "0512-12345678",
            EmailAddress = "zhangsan@gmail.com",
            Address = "江苏省苏州市星湖街328号"
        });
        contacts.Add(new Contact
        {
            Id = "002",
            Name = "李四",
            PhoneNo = "0512-23456789",
            EmailAddress = "lisi@gmail.com",
            Address = "江苏省苏州市金鸡湖大道328号"
        });
    }
  
  
    public IEnumerable<Contact> Get(string id = null)
    {
        return from contact in contacts
               where contact.Id == id || string.IsNullOrEmpty(id)
               select contact;
    }
  
    public void Post(Contact contact)
    {
        Interlocked.Increment(ref counter);
        contact.Id = counter.ToString("D3");
        contacts.Add(contact);
    }
  
    public void Put(Contact contact)
    {
        contacts.Remove(contacts.First(c => c.Id == contact.Id));
        contacts.Add(contact);
    }
  
    public void Delete(string id)
    {
        contacts.Remove(contacts.First(c => c.Id == id));
    }
}

Global注册路由

public class Global : System.Web.HttpApplication
{
  
    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalConfiguration.Configuration.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional });
    }
}

需要引用的dll

System.Web.Http.dll 
System.Net.Formatting.Http.dll 
System.Web.Http.WebHost.dll 
System.Net.Http.dll

http://www.cnblogs.com/artech/p/web-api-sample.html

written by ocean

5月 20

ASP.NET MVC出来也有一阵子.之前也有写过 150行C#代码实现自己的MVC

打算学习一下restful,结果发现是基于MVC的.只能先学习一下了

 

 

ASP.NET MVC由以下两个核心组成部分构成:

  1. 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称;

  2. 一个名为MvcHandler的自定义HttpHandler,用来实现对Controller的激活和Action的执行;

整个ASP.NET MVC系统的路由信息全部存放在RoteTable这个类的静态变量Routes(为一个RouteCollection类型)中,网站开始运行时,在Application_Start中对路由进行注册:

public static void RegisterRoutes(RouteCollection routes)         
{         
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");         
                    
    routes.MapRoute(         
                    
        //是路由的名称,这个名称在应用程序的路由的集合(routes对象)中是唯一的,如果重名生成时就会报错。         
        name: "Default",         
                    
        //代表的是路由的 URL表达式。         
        url: "{controller}/{action}/{id}",         
                    
        //声明了一个包含路由值的object匿名对象         
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }         
    );          
}

 IgnoreRoute()是RouteCollection路由表类的扩展方法,用于忽略指定的路由请求。这句意思是忽略对扩展名为.axd文件的请求

 

 

路由匹配规则

  {controller}对应控制器的名称,这里规定是控制器全名去掉Controller后缀的部份,CategoryController即Category

  {action}对应控制器内的Action方法的名称

URL表达式都是相对的,不包括主机域名部份(比如http://www.xxx.com)。{}保存的是占位符,“/”,“.”则用来作为分隔符,什么都有没则是静态内容

URL /category/showcategory/1000  匹配 "{controller}/{action}/{id}"。

URL /product/2012/4/28.html         匹配  “/product/{year}/{month}/{day}.html”  ,诸如此类。

 

 

MVC整个网站目录和特殊文件

  • App_Data

    • 这个目录跟我们一般的ASP.NET website是一样的,用于存放数据。

  • Content

    • 这个目录是建议用来存放一下资源文件的。例如CSS、JS、图片等等。当然你不愿意的话,完全可以不放到这里来。

  • Controllers

    • 这个目录是建议将Controller类都放到这里来,方便管理。Controller类的命名必须以Controller结尾,例如一个名为Home的Controller则要命名为HomeController。

  • Models

    • 这个目录是建议用来存放你的业务实体、数据访问层代码的类的。当然,更好的做法我觉得应该是将Models独立为一个类库。

  • Views

    • 在默认情况下,所有的view文件都必须放到这个目录下来,每一个Controller对应一个子目录,而且子目录的命名必须以Controller的命名一样。例如,HomeController的view就应该放到Home子目录中。我们见到Views目录下还有一个Shared的子目录,这个子目录是用于存放一些共享的view的,例如Error.aspx和Site.Master。Controller在Views\ControllerNmae 中找不到指定的view的时候,会到Shared中去寻找。

 

啥都没有写个例子好.简单的例子

 

添加路由规则

routes.MapRoute("User", "user/{id}", new { controller = "Home", action = "User" });

~/Controllers/HomeController.cs 添加Action

public ActionResult User(int id)   
{   
    TestDemo.MVC.Models.User user = new TestDemo.MVC.Models.User() {   
     UserId=id,   
     UserName = "UserName"+id,   
    };   
    return View(user);   
}

~/Models/User.cs 添加Model

public class User   
{   
    public int UserId { get; set; }   
    public string UserName { get; set; }   
}

 ~/Views/Home/User.cshtml 添加View

@model TestDemo.MVC.Models.User   
@{  
    ViewBag.Title = "User";  
}   
<h2>User</h2>   
UserId: @Model.UserId,UserName:@Model.UserName

 访问路径

http://localhost:5949/user/3

记录路由规则加在前面

 

written by ocean

2月 26

前台:  

      <asp:GridView ID="GridView1"
   
         runat="server"
AutoGenerateColumns="False" CellPadding="4"
                           ForeColor="#333333" GridLines="None"
           OnRowCancelingEdit="GridView1_RowCancelingEdit"
            OnRowDeleting="GridView1_RowDeleting"
            OnRowEditing="GridView1_RowEditing"
            OnRowUpdating="GridView1_RowUpdating" DataKeyNames="LogonID">
             <Columns>
                 <asp:BoundField DataField="LogonID" HeaderText="登陆ID" ReadOnly="True" />
                 <asp:BoundField DataField="Password" HeaderText="密码" />
                 <asp:BoundField DataField="Name" HeaderText="姓名" />
                 <asp:BoundField DataField="EmailAddress" HeaderText="电子邮件" />
                 <asp:CommandField HeaderText="选择" ShowSelectButton="True" />
                 <asp:CommandField HeaderText="编辑" ShowEditButton="True" />
                 <asp:CommandField HeaderText="删除" ShowDeleteButton="True" />
             </Columns>
           
             <RowStyle BackColor="#EFF3FB" />
                           <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                           <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                           <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
             <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
             <EditRowStyle BackColor="#2461BF" />
             <AlternatingRowStyle BackColor="White" />

           
         </asp:GridView>

后台:

     leiku dal = new leiku();
     protected void Page_Load(object sender, EventArgs e)
     {
         if (!Page.IsPostBack)
         {
             BindDataSource();
         }
     }

     void BindDataSource()
     {
         GridView1.DataSource = dal.GetList();
         GridView1.DataBind();
     }
     protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
     {
         dal.Delete(GridView1.DataKeys[e.RowIndex].Value.ToString());
         BindDataSource();
     }
     protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
     {
         GridView1.EditIndex = e.NewEditIndex;
         BindDataSource();

     }
     protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
     {
         string x1 = GridView1.DataKeys[e.RowIndex].Value.ToString();
         //string x1 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[0].Controls[0])).Text.ToString().Trim();
         string x2 = "dsdds";
         //string x2 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text;
             string x3=((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim() ;
             string x4=((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() ;

             dal.Update(x1, x2, x3, x4);
             GridView1.EditIndex = -1;
         BindDataSource();
     }
     protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
     {
         GridView1.EditIndex = -1;
         BindDataSource();
     }

两点注意:

第一:设置DataKeyName

第二:判断回传,也就是Page.IsPostBack的判断

否则会出现问题

written by ocean