本站文章均为原创,欢迎转载,转载请注明出处.谢谢!
分类: Net预览模式: 普通 | 列表

异常:HRESULT: 0x80070057 (E_INVALIDARG) 的处理

碰到这个异常的原因很偶然:

现象:
Solution在ReBuild过程中断电了,来电恢复了,重析编译整个Solution不报错,但在浏览页面时始终无法正常浏览,而在design的视图中,每个aspx的首行代码都报错。

解决过程:

搜索找到很多国内的方案,有的建议重新引用AjaxControlToolkit.dll,还有就是清除asp.net的缓存文件,但都没有看到想要的效果,最后在一个国外MSDN的贴子(http://social.msdn.microsoft.com/Forums/en-US/csharpide/thread/352c58ec-65d8-4d77-ac7b-d2338c621ef3)中看到种种处理办法.

相关方法可以尝试一下,不能保证所有的方案都能达到效果,但应该也八九不离十了吧。呵呵。

方案1:清空Temporary ASP.NET Files文件夹的文件,重新编译

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\MyWebService and recompiled and it worked fine.

这个方法是网上推荐得最多的方案,好像也可行,也不可行。里面有些文件不能直接删除,需要通过特殊手段进行删除。


方案2:卸载系统上所有的Net Framework的版本,IIS,重新安装Net Framework,IIS

这个方法好像比较麻烦,而且也不太能确定能达到解决异常的效果。就网上看到的结果而言,大多数人这样操作并没有解决问题。这里要注意安装的顺序
•Uninstall .NET (Runtime and SDK)->Uninstall IIS->Install .NET (Runtime and SDK)->Install IIS


方案3:这个方法我没看懂,就不解释了,貌似比较复杂Background: The assembly causing me trouble was built in house and I did not have the source code.

Required: You need the Visual Studio SDK for ildasm.exe



Steps:


1.) Disassemble the .dll with the command ildasm.exe AssemblyName.dll /out:AssemblyName.il  

2.) Open the newly created AssemblyName.il with a text editor and search for "permissionset"

3.) Find and delete the following lines:


  .permissionset reqmin
             = {[mscorlib]System.Security.Permissions.PermissionSetAttribute = {property string 'Name' = string('nobody')},
                [mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'Execution' = bool(true)}}



4.) Save and rebuild the assembly with the following command: ilasm.exe AssemblyName.il /dll

5.) Throw the new dll in your bin directory or if it's strong named and needed in the GAC you can put it there.


方案4:清除 系统盘:\用户\用户名称\AppData\Local\Temp\Temporary ASP.NET Files里面的文件
C:\Users\<name>\AppData\Local\Temp\Temporary ASP.NET Files


我是用这个方案搞掂的,恰巧我的是win7的系统.不过好像这个与方案1配合使用较好.注意:Vista系统与Window7系统这个尤为适合


一点心得,与大家分享。欢迎指正。

查看更多...

分类:Net | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 45

NPOI动态获取数据源绑定Gridview显示

第一次用这个东西,还是比较顺利,用起来也比较好 记录一下



1.引用

using NPOI;
using NPOI.HSSF;
using NPOI.DDF;
using NPOI.POIFS;
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;

2.主要代码

  /// <summary>
        /// 绑定数据
        /// </summary>
        protected void BindExcelData()
        {

            //先上传 再打开

            HSSFWorkbook workbook = new HSSFWorkbook(this.fupFile.FileContent);

            HSSFSheet sheet = workbook.GetSheetAt(0);

            DataTable table = new DataTable();

            HSSFRow headerRow = sheet.GetRow(0);

            int cellCount = headerRow.LastCellNum;

            //一定要对单元格类型作判断 否则会报错 cannot get a string value from a numeric cell
            for (int i = headerRow.FirstCellNum; i < cellCount; i++)
            {
                if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
                {
                    // 如果遇到第一个空列,则不再继续向后读取            
                    cellCount = i + 1;
                    break;
                }
                DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);

                table.Columns.Add(column);
            }


            int rowCount = sheet.LastRowNum;

            for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
            {
                HSSFRow row = sheet.GetRow(i);
                if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "")
                {
                    // 如果遇到第一个空行,则不再继续向后读取                
                    break;
                }
                DataRow dataRow = table.NewRow();
                for (int j = row.FirstCellNum; j < cellCount - 1; j++)
                {
                    if (row.GetCell(j) != null)
                    {
                        dataRow[j] = row.GetCell(j).ToString();
                    }
                }
                table.Rows.Add(dataRow);
            }


            //workbook = null;
            //sheet = null;

            this.gdvList.DataSource = table;

            this.gdvList.AutoGenerateColumns = true;

            this.gdvList.DataBind();

            gdvList.DataKeyNames = new string[] { "IMEI" };

            this.gdvList.PageSize = 20000;

            lblCount.Text = gdvList.Rows.Count.ToString();
        }



3.要注意的地方

NPOI对日期格式的转换,显示出来的日期不是我们常用的yyyy-MM-dd格式,需要做特殊判断


       public static string ConvertDate(string date)
        {
        
            string[] orginDate = date.Trim().Split('-');

            string year = orginDate[2].ToString().Trim();

            string day = orginDate[1].ToString().Trim();

            string month = orginDate[0].ToString().Trim();

            if (day.Length == 1)
            {
                day = "0" + day.ToString();
            }

            if (month.Length == 1)
            {
                month = "0" + month.ToString().Trim();
            }

            if (year.Length == 2)
            {
                year = "20" + year.ToString().Trim();
            }


            return year + "-" + month + "-" + day;

        }



查看更多...

分类:Net | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 107

PLS-00306:错误解决思路

如果你是像我一样初次使用Net+Oracle的结合,我想你会跟我一样,有很大的概率碰到这个问题

=======================================================
PLS-00306: wrong number or types of arguments in call to '存储过程名'
orA-06550: line 1, column 7:
PL/SQL: Statement ignored
=======================================================

或者说像这样子的:

pls-00306 调用 时参数个数或类型错误


如果没有经验的话,就会一头雾水到处乱撞。我也是被这个搞得很痛苦了,我把自己解决这问题思路与大家分享一下,希望能对您有所帮助.

Step1:确认你的Oracle包中的存储过程中的参数的总数,是否与您在Net中调用存储过程中的参数保持一致的数目。还有就是要注意function传参与procedure传参的参数的不同写法.

function传参的时候需要加入:号
例如:


Step2:确认你在Oracle包中的存储过程的参数的数据类型,是否能与您在Net中调用存储过程中的参数的数据类型匹配


Step3:确认你在Net应用程序中所使用的连接存储过程和获取返回值的方法是否正确..

这主要是在使用function的时候与使用procedure的时候,当需要获取存储过程或包中的返回的值的时候需要注意的不同方法.一般我们在获取function的返回值的时候使用的是

new oracleParameter(":P_PRICEFORMID",OracleType.VarChar,20),
new oracleParameter(":P_VENDOR_CODE",OracleType.VarChar,20),
new oracleParameter(":P_VENDOR_SITE_CODE",OracleType.VarChar,20),
new oracleParameter(":P_VAT_CODE",OracleType.VarChar,20),
new oracleParameter(":P_ITEM_CODE",OracleType.VarChar,20),:

而使用procedure的时候是不用:号的


Step4:确认你所传入Oracle中的各参数的值是否会出现null值.

在传入参数过多的时候,这里面的问题很难发现.只能通过一个一个值传入去测试.所以最好的解决办法是将所要传入的参数都给定一个默认值,同时要注意数据类型的匹配.尽量避免null值和空值的传入. 有些情况下使用VS的断点去追踪,明明看见有值,可以在传入oracle表内就会没值,这种情况要特别注意.我就是碰到这样的情况了.


Step5:确认你的服务器端Oracle版本是否与你在客户端Oracle的版本保持一致.

有些时候因为在不同的客户端版本下所编译的包的结果会有所差异,比如我在8i的情况下编译通过,有可能在9i的版本就会通不过,这可能与pl/sql的语法规定有关.所以尽量保持客户端与服务器的oracle版本一致.最好的判断办法就是看看 sql plus的版本是否是一致.


我拿自己在实际过程中碰到的一个例子来说明吧.
见:
http://topic.csdn.net/u/20091019/00/8f05ee3b-e41c-4aff-bafd-a68d47f8eebf.html

我报的错是这样的:
报错如下:

orA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'InsertTOEBSCODE'
orA-06550: line 1, column 7:
PL/SQL: Statement ignored

我的问题是:在本机上测试正常,放至服务器上就出现问题了.最终找到的根缘在于我有个字段传了个null值或是没有传入值进入,导至报错.我是一个一个字段去把这原因找出来的.虽说有点笨拙,但还是把问题给找出来了.




我的操作类中的方法:

这里要注意几点的是:

1.要获取包中存储过程返回的值,需要这样写
parameters[13].Direction=ParameterDirection.Output;
2.注意C#与Oracle的时间转换 一般最好的解决方法是在C#中设置成string类型,然后在Oracle中通过to-date()函数把它转化成时间格式.一开始我也是在这碰了个丁子,后来通过在c#传入所要的时间格式,在oracle中转换成要用的时间格式即可.
parameters[5].Value = effectiveDate.ToString("yyyy-MM-dd hh:mm:ss");
要规定格式是因为考虑在服务器端是英文操作系统,所得到的默认时间格式与客户端所提交的不同.所以需要根据服务器端的系统环境进行时间格式的设置.



/// <summary>
        /// 插入已OK的价格至EBS中
        /// </summary>
        /// <param name="priceForm"> </param>
        /// <returns> </returns>
        public bool InsertToEBS(Entity.CAS.PriceFormInfo priceForm)
        {
            oracleParameter[] parameters =
            {
                new oracleParameter("P_PRICEFORMID",OracleType.VarChar,20),
                new oracleParameter("P_VENDOR_CODE",OracleType.VarChar,20),
                new oracleParameter("P_VENDOR_SITE_CODE",OracleType.VarChar,20),
                new oracleParameter("P_VAT_CODE",OracleType.VarChar,20),
                new oracleParameter("P_ITEM_CODE",OracleType.VarChar,20),
                new oracleParameter("P_EFFECTIVE_DATE",OracleType.VarChar,20),
                new oracleParameter("P_PURCHASER",OracleType.VarChar,20),
                new oracleParameter("P_CHECKER",OracleType.VarChar,20),
                new oracleParameter("P_AUDITOR",OracleType.VarChar,20),
                new oracleParameter("P_POCT",OracleType.VarChar,10),
                new oracleParameter("P_UNIT_PRICE",OracleType.VarChar,20),
                new oracleParameter("P_PASSED_DATE",OracleType.VarChar,20),
                new oracleParameter("P_TERMS_DESC",OracleType.VarChar,100),
                new oracleParameter("v_retval",OracleType.Number)

            };


            parameters[0].Value = priceForm.FormID.ToString();
            parameters[1].Value = priceForm.SupplierCode;
            parameters[2].Value = priceForm.Vendor_site_code;
            parameters[3].Value = priceForm.Tax.ToString();
            parameters[4].Value = priceForm.MaterialCode.Trim();


            DateTime effectiveDate= Convert.ToDateTime(priceForm.EffectiveDate.ToString());

            DateTime passedDate= Convert.ToDateTime(priceForm.PassedDate.ToString());

        

            if (priceForm.EffectiveDate > priceForm.PassedDate)
            {


                parameters[5].Value = effectiveDate.ToString("yyyy-MM-dd hh:mm:ss");

          
            }
            else
            {
                parameters[5].Value = passedDate.ToString("yyyy-MM-dd hh:mm:ss");
            }
            parameters[6].Value = priceForm.Purchaser;
            parameters[7].Value = priceForm.Checker;
            parameters[8].Value = priceForm.Auditor;
            parameters[9].Value = priceForm.POCT;
            parameters[10].Value = priceForm.Price.ToString();
            parameters[11].Value = passedDate.ToString("yyyy-MM-dd hh:mm:ss");
            parameters[12].Value = priceForm.Payment.ToString().Trim();
            parameters[13].Direction=ParameterDirection.Output;

          

            try
            {
                Convert.ToInt32(OracleHelper.ExecuteNonQuery(OracleHelper.ConnectionStringProfile, CommandType.StoredProcedure, "PO_CAS_PRICE_PKG.InsertToEBSCode", parameters));

                int retval = Convert.ToInt32(parameters[13].Value);

                if (retval == 1)
                {
                    return true;
                }
                else

                    return false;
            }
            catch (Exception ee)
            {
                throw ee;
            }
            finally
            {

            }

包中的存储过程
中的存储过程:

create or replace package PO_CAS_PRICE_PKG is

  -- Author  : EASTJAZZ
  -- Created : 2009-10-16 0:29:13
  -- Purpose :

  procedure InsertToEBSCode(P_PRICEFORMID      IN VARCHAR2,
                            P_VENDOR_CODE      IN VARCHAR2,
                            P_VENDOR_SITE_CODE IN VARCHAR2,
                            P_VAT_CODE        IN VARCHAR2,
                            P_ITEM_CODE        IN VARCHAR2,
                            P_EFFECTIVE_DATE  in VARCHAR2,
                            P_PURCHASER        IN VARCHAR2,
                            P_CHECKER          IN VARCHAR2,
                            P_AUDITOR          IN VARCHAR2,
                            P_POCT            IN VARCHAR2,
                            P_UNIT_PRICE      IN VARCHAR2,
                            P_PASSED_DATE      IN VARCHAR2,
                            P_TERMS_DESC      IN VARCHAR2,
                            v_retval          out number);

end PO_CAS_PRICE_PKG;


调用函数取得返回值的Example


public string GetItemDescription(string item_code, int org_id)
       {
           oracleParameter[] Parms =
           {
              
               new oracleParameter("p_item_code",OracleType.VarChar,20),
               new oracleParameter("p_org_id",OracleType.Number,4),
               new oracleParameter("v_item_desc",OracleType.VarChar,150)
           };

           Parms[0].Value = item_code;
           Parms[1].Value = org_id;
           Parms[2].Direction = ParameterDirection.ReturnValue;


           IList<Entity.CAS.EBSVendorInfo> vendorItemList = new List<Entity.CAS.EBSVendorInfo>();

           oracleHelper.ExecuteNonQuery(OracleHelper.ConnectionStringProfile, CommandType.StoredProcedure, "PO_VENDORS_PKG.GetItemDescription", Parms);

         return Parms[2].Value.ToString().Trim();
       }


Function:

  function GetItemDescription(p_item_code in varchar2, p_org_id number)
    return varchar2 is
    v_item_desc varchar2(150);
  begin
  
    select msib.DESCRIPTION item_desc
      into v_item_desc
      from MTL_SYSTEM_ITEMS_B msib
    
     where msib.SEGMENT1 = trim(p_item_code)
       and msib.ORGANIZATION_ID = p_org_id;
  
    return v_item_desc;
  
  end GetItemDescription;



初学过程中的一点小经验,与大家分享,欢迎指正.



查看更多...

分类:Net | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1991

[译]使用C#的用户控件创建ActiveX

文章:Create an ActiveX using a Csharp Usercontrol
来源:http://www.codeguru.com/csharp/.net/net_general/comcom/article.php/c16257
原著作者:Andreas Verhamme
翻译:Dezai

这篇文章主要是介绍如何在C#中如何使用DotNet的用户控件来创建ActiveX控件.你可以设计ActiveX的相关属性,方法和事件.

开发环境:Visual Studio2005




查看更多...

Tags: 创建ActiveX

分类:Net | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1030

利用zedGraph实现不定曲线数曲线的生成

呵呵,终于整出来了

我的需求是这样的:

有一大堆的供应商的库存数据要按产品按供应商按时间段进行数据比较,同时产生图表,就是
利用zedGraph实现不定曲线数曲线的生成

还是贴张图来说一下吧。




查看更多...

Tags: zedGraph实现不定曲线数曲线的生成

分类:Net | 固定链接 | 评论: 2 | 引用: 0 | 查看次数: 1682

用户权限管理设计(2)

上篇讲完了数据库的设计,这次我们讲讲在Net中的实现


UI的实现,主要是方便用户操作,考虑用户体验,这个没有什么好说的

后台管理菜单



角色管理列表



新增用户



权限分配





现在,我们根据数据库生成实体类。实体类的设计一般跟数据库的字段相差不大,可以用相关的ORM帮你生成




我们再看看BLL层




我这里是用户-角色的代码,其它的只要根据数据库存储过程就可以看出对应的方法是什么的

/// <summary>
    /// UserRole业务逻辑层
    /// </summary>
    public class MemberRole:ABC.IDAL.Sys.IMemberRole
    {

        private static readonly ABC.IDAL.Sys.IMemberRole dal = ABC.DALFactory.DataAccess.CreateMemberRole();


        /// <summary>
        /// 增加
        /// </summary>
        /// <param name="Model">Model</param>
        /// <returns>bool</returns>
        public bool Insert(ABC.Entity.Sys.MemberRoleInfo Model)
        {
            return dal.Insert(Model);
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="Model">Model</param>
        /// <returns>bool</returns>
        public bool Update(ABC.Entity.Sys.MemberRoleInfo Model)
        {

            return dal.Update(Model);
        }
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="memberRoleID"></param>
        /// <returns>bool</return...

查看更多...

Tags: 用户权限管理设计

分类:Net | 固定链接 | 评论: 1 | 引用: 0 | 查看次数: 2215

ListBox与数据库的绑定操作

ListBox,DropDownList,checkBox这几个控件的属性跟使用方法几乎一样,在做系统的进修使用的频率也多。我这里主要与大家分享一下如何用listbox绑定数据据,及增加数据库,从列表中移除选择项的几个操作方法。其实用javascript也完全可以实现。我这里是用服务器端控件与数据库绑定操作来实现的。各有各的的优缺点。






由上图可知:左边的ListBox我是通过DropDownList的选择来进行绑定数据的。所以ListBox是跟上面的部门DropDownList绑定的,所以我应该在DropdownList的selectedx_changed事件中写绑定ListBox的代码





int departmentID = Convert.ToInt32(ddlDepartment.SelectedValue); //获取Dropdownlist中的选择项的值并转成整型

            BLL.Sys.Member bllMember = new ABC.BLL.Sys.Member();  //初始化一个BLL业务操作层的对象

            if (bllMember.CountByDepartment(departmentID) != 0) //如果绑定的数据总数不为0的情况下
            {

                lstDeptMember.DataSource = bllMember.ListByDepartment(departmentID, 1, bllMember.CountByDepartment(departmentID));  //业务层绑定方法,也就是listBox的数据来源

                lstDeptMember.DataValueField = "MemberID"; //绑定ListBox单项的选择值

                lstDeptMember.DataTextField = "TrueName";//绑定ListBox单项的文字值


                lstDeptMember.DataBind();

            }
            else
            {
                lstDeptMember.Items.Clear(); //清除ListBox的所有项目

                ListItem item = new ListItem();
                item.Text = "暂时无用户";
                item.Value = string.Empty;

                lstDeptMember.Items.Add(item);
            }





加入所选用户

加入所选用户的Button是对右边所选择的值进行一个简单的for循环检测,选中的加到右边的ListBox中



   if (lstDeptMember.SelectedIndex != -1) //lstDeptMember.SelectedIndex!=-1判定是否未选择
            ...

查看更多...

Tags: ListBox 数据库 ListBox绑定

分类:Net | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1182

[译]连接池和 "Timeout expired"异常

原文标题:Connection Pooling and the "Timeout expired" exception FAQ

来源:http://blogs.msdn.com/angelsb/archive/2004/08/25/220333.aspx

作者:angelsb


System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.   This may have occurred because all pooled connections were in use and max pool size was reached.

Timeout expired 异常是个很棘手的异常,想必几乎每个人都碰到过。有时可真是对它咬牙切齿,拿它没办法。 angelsb这篇文章很好,希望对大家有用。我也是看到他讲得很好,才翻译过来的,水平有限,请多多指教.


System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.   This may have occurred because all pooled connections were in use and max pool size was reached.

哎!在另一个进程中,又出现了连接池已满的问题,这是个最让人头痛却又是最常出现的连接池问题之一.原因是在开发过程中很少碰到这个头痛的问题,但在部署APP到客户端时,却总是不经意地跑出来了.我想,我应该花些许时间对这个问题进行一次完整的总结吧.

发生的本质是什么?

我们来认真看一下可能会发生这种异常的两种情况

1) 你使用了超过最大的连接池连接数(默认的最大连接数是100)

在大部分应用程序中,这种情况是很少出现的. 毕竟当你使用连接池时,100个并行连接是一个非常大的数字.根据我的经验,会造成这种异常的原因的最大可能,应该是在一个纯种下打开了100个连接.



SqlConnection[] connectionArray = new SqlConnection[101];
    for (int i = 0; i <= 100; i++)
    {
        connectionArray = new SqlConnection("Server=.\\SQLEXPRESS ;Integrated security=sspi;connection timeout=5");
        connectionArray[i].Open();
    }




解决方案:如果你确定你将会使用超过100个并行连接(在同一连接字符串上),你可以增加最大连接数.

2) 连接泄漏

我个人认为的连接泄漏定义是你打开了一个连接但你没有在你的代码中执行close()或dispose().这范围不仅仅是你忘记了在connection后连接后使用dispose()或close()对期进行关闭,还包括一些你已经在相关connection后写好了close()却根本没有起作用的情況.我们来看看下面的代码:



using System;
using System.Data;
using System.Data.SqlClient;

public class Repro
{
    public static int Main(string[] args)
    {
        Repro repro = new Repro();
        for (int i = 0; i <= 5000; i++)
        {
            try{ Console.Write(i+" ");    repro.LeakConnections(); }
            catch (SqlException){}
        }

        return 1;
    }
    public void LeakConnections()
    {    
        SqlConnection sqlconnection1 = new SqlConnection("Server=.\\SQLEXPRESS ;Integrated security=sspi;connection timeout=5");
        sqlconnection1.Open();
        SqlCommand sqlcommand1 = sqlconnection1.CreateCommand();
        sql...
[/i]

查看更多...

Tags: Timeout expired|连接池|最大连接池

分类:Net | 固定链接 | 评论: 3 | 引用: 0 | 查看次数: 3782

问题描述:

the page contains markup that is not valid when attached to a master page 当使用了样式跟皮肤的时候,打开.aspx页,就会出现这个东西了。不知是不是Bug




这是MSDN的反馈:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=314745

我的解决办法很奇怪:


打开Source视图:
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <uc1:Add ID="Add1" runat="server" />
</asp:Content>

在这里随便打一个回车再返回到view视图就可以了~~~


<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <uc1:Add ID="Add1" runat="server" />
    
    
</asp:Content>


//注意区别:我上面多了两个空行



我查了一下国外的资料,还有一种方法是:

将aspx或master里面的

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

换成

<!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">


这种方法没有试过,大家可以试一下。



小记一下。但愿能给您带来帮助.



查看更多...

Tags: The page contains markup that is not valid when attached to master page

分类:Net | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 5013