Visual Studio 2008生成.csproj会重复的bug

问题描述:
NB6K发布的时候出现:错误 103 The item "6k\confirmation.aspx.cs" was specified more than once in the "Sources" parameter.  Duplicate items are not supported by the "Sources" parameter. NetSNS.Web

问题分析:
刚刚修改了几个文件,可能是.csproj文件出现重复定义。

问题解决:
用记事本打开.csproj文件,查看重复定义的内容,删除之。一切正常了。

Microsoft.Office.Interop.Excel中Workbook.Close(false, Type.Missing, Type.Missing);保存总有保存提示框的问题。

问题描述:
近来做青岛自来水集团的项目,需要在Asp.Net中在服务器端修改Excel,功能实现了,但是发现,每次Workbook.Close(false, Type.Missing, Type.Missing);都会在服务器端弹出保存文件提示框。虽然Workbook.Save();实现保存了,但是每次还是弹出。

问题分析:
查了一些资料,可能是一个BUG。找了一个小时,终于在不起眼的网页上找到了解决方案。

问题解决:
因为在Workbook.Save();的时候没有把Workbook.Saved设置为true,导致了一只提示保存,两句语句可以解决该问题,如下:

            Workbook.Saved = true;
            Application.DisplayAlerts = false;

Webservice中LinqToSQL执行ToList序列化产生循环引用错误

问题描述:在做Tiffany的时候,用到Linq通过Webservice返回数据给Flash。但是当执行结果集.ToList()的时候出现如下错误:
System.InvalidOperationException: 生成 XML 文档时出错。 ---> System.InvalidOperationException: 序列化类型 Tiffany.Photo 的对象时检测到循环引用。
在 System.Xml.Serialization.XmlSerializationWriter.WriteStartElement(String name, String ns, Object o, Boolean writePrefixed, XmlSerializerNamespaces xmlns)
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write3_Photo(String n, String ns, Photo o, Boolean isNullable, Boolean needType)
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write2_Vote(String n, String ns, Vote o, Boolean isNullable, Boolean needType)
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write3_Photo(String n, String ns, Photo o, Boolean isNullable, Boolean needType)
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write5_ArrayOfPhoto(Object o)
在 Microsoft.Xml.Serialization.GeneratedAssembly.ListOfPhotoSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer)
在 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
--- 内部异常堆栈跟踪的结尾 ---
在 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
在 System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
在 System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o)
在 System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue)
在 System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
在 System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
在 System.Web.Services.Protocols.WebServiceHandler.Invoke()

问题分析:查看报错内容,“检测到循环引用”说明Linq的关系引用上存在问题。

问题解决:打开DataClassses-关联-子属性-访问权限,改为Internal

Asp.Net中Response.Write()导致页面CSS无效

问题描述:在修改NB网站的时候,发现响应按钮后出现全部字体变大现象,即不受CSS样式控制。

问题查找:因为这个响应按钮的方法内语句比较少,Response.Write()尤为惹眼,猜想是因为直接输入而产生了此问题:Response.Write("<script>alert('请勾选“本人已阅读兑换细则”')</script>");

问题求证:删除语句后发现果然一切正常了。

问题分析:Response.Write()是输出到页面的最顶端,导致了页面不符合DTD规范:
<!-- DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" -->

问题解决:使用微软推荐方法:Page.RegisterStartupScript("submitImageButtonClick", "<script>alert('请勾选“本人已阅读兑换细则”')</script>");
第一个参数是Script的名字,随便取。
第二个参数是Script,直接贴上去就行。

ASP.NET刷新页面的六种方法

第一:
private void Button1_Click( object sender, System.EventArgs e )  
{
    Response.Redirect( Request.Url.ToString( ) );
}

第二:
private void Button2_Click( object sender, System.EventArgs e )  
{
    Response.Write( " <script language=javascript>window.location.href=document.URL; </script>" );
}

第三:
private void Button3_Click( object sender, System.EventArgs e )  
{
    Response.AddHeader( "Refresh","0" );
}

第四:
private void Button6_Click( object sender, System.EventArgs e )  
{  
    Response.Write( " <script language=javascript>window.location.reload( ); </script>" );
}

第五:(需替换<>)
<script><!--
var limit="3:00"
if ( document.images )
{
    var parselimit=limit.split( ":" )parselimit=parselimit[0]*60+parselimit[1]*1
}
function beginrefresh( )
{
    if ( !document.images )returnif ( parselimit==1 )window.location.reload( )else
    {
        parselimit-=1curmin=Math.floor( parselimit/60 )cursec=parselimit%60if ( curmin!=0 )curtime=curmin+"分"+cursec+"秒后重刷本页!"elsecurtime=cursec+"秒后重刷本页!"window.status=curtimesetTimeout( "beginrefresh( )",1000 )
    }
}
window.onload=beginrefresh//-->  </script><DIV style="Z-INDEX: 102;
LEFT: 408px;
POSITION: absolute;
TOP: 232px" ms_positioning="text2D">
<P><FONT size="3">自动刷新页面</FONT></P>
</DIV>

第六:
<meta http-equiv="refresh" content="300; url=target.html">

通过VS2008调试ASP.NET出现“Internet Explorer 无法显示该页面”问题

问题:
通过VS2008启动程序调试ASP.NET时报错。错误提示为:Internet Explorer 无法显示该页面。

分析:
首先,因为是新装的系统,觉得是端口问题。把杀毒软件、防火墙都关掉,并用netstat -an检查,一切正常。说明端口正常。
然后,随便ping的一下localhost。发现一解析到::1,而不是127.0.0.1。使用netstat -an,VS只有在ipv4上监听,而在ipv6上没有。终于找到问题所在了。

解决:
首先,以为是c:\windows\system32\drivers\etc\hosts文件设置。打开后发现没有有关::1的条目,设置如下这样也无效: 
127.0.0.1      localhost
::1
最后,实在没有办法,直接卸载ipv6算了:ipv6 uninstall。问题终于解决啦。

DataPager分页问题(点击两次)

今天碰到个怪问题,一直搞到半夜2点多。以下是解决办法:

今天看了一下ListView和DataPager配合做数据分页的教程,感觉很爽很方便,用在自己的项目上面时却出现了问题,具体表现在点击上一页、下一页或者数字跳转页面时通常要点两下才能有反应,而且有时候乱跳页。 

我开始测试的代码是这样的:

public partial class ListViewTest : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        
if (!Page.IsPostBack)
            BindData();
    }
    
    
protected void BindData()
    {
        DBDataContext db 
= new DBDataContext();
        var ds 
= db.Category;
        ListView1.DataSource 
= ds;
        ListView1.DataBind();
        db.Dispose();
    }
}

出现如开始提及的问题,找了半天原因也没有找到。后来在国外的一个论坛上找到了同病相怜的人,有专家给出了一个解决方案。把Page_Load里的数据绑定移到Page_PreRender中,也就是:

public partial class ListViewTest : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        
//if (!Page.IsPostBack)
        
//    BindData();
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        BindData();
    }
    
    
protected void BindData()
    {
        DBDataContext db 
= new DBDataContext();
        var ds 
= db.Category;
        ListView1.DataSource 
= ds;
        ListView1.DataBind();
        db.Dispose();
    }
}

试了一下分页果然正常了。难道是Page_Load来的太迟?不得而知。另外,还有一种方法同样可行:

public partial class ListViewTest : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        
if (!Page.IsPostBack)
            BindData();
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        
//BindData();
    }

    protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
    {
        DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, 
false);
        BindData();
    }

    protected void BindData()
    {
        DBDataContext db 
= new DBDataContext();
        var ds 
= db.Category;
        ListView1.DataSource 
= ds;
        ListView1.DataBind();
        db.Dispose();
    }
}