??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩欧美国产综合,亚洲女同一区二区,一区国产精品视频http://www.aygfsteel.com/zengke/category/16328.htmlzh-cnFri, 06 Jul 2007 03:58:35 GMTFri, 06 Jul 2007 03:58:35 GMT60Introduce of ASP.NET 2.0 Membershiphttp://www.aygfsteel.com/zengke/articles/128482.htmlFri, 06 Jul 2007 01:01:00 GMThttp://www.aygfsteel.com/zengke/articles/128482.htmlhttp://www.aygfsteel.com/zengke/comments/128482.htmlhttp://www.aygfsteel.com/zengke/articles/128482.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/128482.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/128482.html阅读全文

2007-07-06 09:01 发表评论
]]>
DataGirdhttp://www.aygfsteel.com/zengke/articles/118474.htmlFri, 18 May 2007 15:41:00 GMThttp://www.aygfsteel.com/zengke/articles/118474.htmlhttp://www.aygfsteel.com/zengke/comments/118474.htmlhttp://www.aygfsteel.com/zengke/articles/118474.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/118474.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/118474.html//d表Supplierq绑定到GridView?br>private void BindGvSupplier()
{
OracleConnection conn = this.Conn();
OracleCommand cmd = new OracleCommand("select * from Supplier", conn);
OracleDataAdapter sda = new OracleDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds, "Supplier");

string[] SuppId = new string[ds.Tables["Supplier"].Rows.Count];
for (int i = 0; i < ds.Tables["Supplier"].Rows.Count; i++)
{
SuppId[i] = ds.Tables["Supplier"].Rows[i][0].ToString();
}
this.gvSupplier.DataSource = ds.Tables["Supplier"];
this.gvSupplier.DataKeyNames[0] = "SuppId";
this.gvSupplier.DataBind();
this.lblPageIndex.Text = Convert.ToString(int.Parse(this.gvSupplier.PageIndex.ToString()) + 1);
this.lblTotalPage.Text = this.gvSupplier.PageCount.ToString();
this.lblCount.Text = this.GetTotalCount().ToString();
}

//分页触发的事?br>protected void gvSupplier_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
this.gvSupplier.PageIndex = e.NewPageIndex;
this.BindGvSupplier();
this.lblPageIndex.Text = Convert.ToString(int.Parse(this.gvSupplier.PageIndex.ToString()) + 1);
this.cbAllSelect_CheckedChanged(this.cbAllSelect, e);
}

//删除按钮触发的事?br>protected void gvSupplier_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int id = e.RowIndex;

GridViewRow gvr = this.gvSupplier.Rows[id];
int SuppId=int.Parse(((HyperLink)(gvr.Cells[7].Controls[0])).Text.ToString());
string sqlString = "delete from Supplier where SuppId=" + SuppId;
//如果本页只有一条数据,删除后要向前M?br>if (this.gvSupplier.Rows.Count == 1)
{
if (this.gvSupplier.PageIndex > 1)
{
this.gvSupplier.PageIndex--;
}
}
int result = ExecuteSql(sqlString);
if (result == 1)
{
this.Alert("你成功删除一条数?, this.Page);
}
this.BindGvSupplier();
this.BindGvSupplier();

}

//l定删除按钮的确认提C?br>protected void gvSupplier_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
LinkButton myLb = (LinkButton)(e.Row.Cells[8].Controls[1]);
myLb.Attributes.Add("onclick","javascript:return confirm('你确认删?+e.Row.Cells[0].Text+"?')");
//鼠标l过时改变行的颜?br>e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#ffffe7'");
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='transparent'");
}
}


//执行一条Oracle语句
private int ExecuteSql(String sqlString)
{
//try
//{
OracleConnection conn = this.Conn();
conn.Open();
OracleCommand cmd = new OracleCommand(sqlString, conn);
int effectedLine = cmd.ExecuteNonQuery();
conn.Close();
return effectedLine;
//}
//catch
//{
// return 0;
//}
}


//点击~辑按钮时触发的事g
protected void gvSupplier_RowEditing(object sender, GridViewEditEventArgs e)
{
string s = this.gvSupplier.DataKeys[e.NewEditIndex][1].ToString();
this.txtAddr1.Text = "dddd" + s;
this.gvSupplier.EditIndex = e.NewEditIndex;
this.BindGvSupplier();
}
//点击取消按钮时触发的事g
protected void gvSupplier_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
this.gvSupplier.EditIndex = -1;
this.BindGvSupplier();
}
//点击更新按钮时触发的事g
protected void gvSupplier_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
int id = e.RowIndex;
GridViewRow gvr = this.gvSupplier.Rows[id];
int suppId = int.Parse(((HyperLink)(gvr.Cells[7].Controls[0])).Text.ToString());
string name = ((TextBox)gvr.Cells[0].Controls[0]).Text.ToString();
string status = ((TextBox)gvr.Cells[1].Controls[0]).Text.ToString();
string addr1 = ((TextBox)gvr.Cells[2].Controls[0]).Text.ToString();
string addr2 =((TextBox) gvr.Cells[3].Controls[0]).Text.ToString();
string city = ((TextBox)gvr.Cells[4].Controls[0]).Text.ToString();
string state = ((TextBox)gvr.Cells[5].Controls[0]).Text.ToString();
string zip=((TextBox)gvr.Cells[6].Controls[0]).Text.ToString();
string sqlString = "update Supplier set Name='" + name + "',Status='" + status + "',Addr1='" + addr1 + "',Addr2='" + addr2 + "',City='" + city + "',State='" + state + "',Zip='" + zip + "' where SuppId=" + suppId;
int result = ExecuteSql(sqlString);
if (result == 1)
{
//......
}
this.gvSupplier.EditIndex = -1;
this.BindGvSupplier();
}


 
 
Top
 
 回复人:EvilYangs(EvilYang) ( ) 信誉Q?00 2006-7-14 15:45:21 得分:0
 
 
?
//增加一条记?br>protected void btnAdd_Click(object sender, EventArgs e)
{
string name = this.txtName.Text.ToString();
string status = this.txtStatus.Text.ToString();
string addr1 = this.txtAddr1.Text.ToString();
string addr2 = this.txtAddr2.Text.ToString();
string city = this.txtCity.Text.ToString();
string state = this.txtState.Text.ToString();
string zip = this.txtZip.Text.ToString();
string sqlString = "insert into Supplier values(SQSuppId.Nextval,'" + name + "','" + status + "','" + addr1 + "','" + addr2 + "','" + city + "','" + state + "','" + zip + "')";
if (this.ExecuteSql(sqlString) == 1)
{
this.Alert("你成功添加一条数?, this.Page);
}
else
{
this.Alert("d未成功!", this.Page);
}
this.BindGvSupplier();
}

//查看共有多少条数?br>private int GetTotalCount()
{
//try
//{
OracleConnection conn = this.Conn();
conn.Open();
OracleCommand cmd = new OracleCommand("select count(*) from Supplier", conn);
int count = Convert.ToInt32(cmd.ExecuteScalar());
conn.Close();
return count;
//}
//catch
//{
// return 0;
//}
}

//弹出警告H口
public void Alert(string str_Message, Page page)
{
page.RegisterStartupScript("", "<script>alert('" + str_Message + "');</script>");
}

//弹出认对话?br>public void Confirm(string str_Message, string btn, Page page)
{
page.RegisterStartupScript("", "<script> if (confirm('" + str_Message + "')==true){document.forms(0)." + btn + ".click();}</script>");
}

protected void cbAllSelect_CheckedChanged(object sender, EventArgs e)
{
for(int i=0;i<this.gvSupplier.Rows.Count;i++)
{
CheckBox cbSelect=(CheckBox)(gvSupplier.Rows[i].Cells[10].FindControl("cbSelect"));
cbSelect.Checked=this.cbAllSelect.Checked;
}
}

//当点d除按钮时删除所有checkbox被选中的数?br>protected void btnDel_Click(object sender, EventArgs e)
{
//如果用户认触发btnRealDel的事?br>this.Confirm("你真的要删除你所选的数据么?", "btnRealDel", this.Page);

}

//真实的删除操?br>public void btnRealDel_Click(object sender, EventArgs e)
{
int count = 0;
for (int i = 0; i < this.gvSupplier.Rows.Count; i++)
{
CheckBox myCb = (CheckBox)(this.gvSupplier.Rows[i].Cells[10].FindControl("cbSelect"));
if (myCb.Checked)
{
count++;
HyperLink hl = (HyperLink)(this.gvSupplier.Rows[i].Cells[7].Controls[0]);
int suppId = int.Parse(hl.Text.ToString());
string sqlString = "delete from Supplier where SuppId=" + suppId;
this.ExecuteSql(sqlString);
}
}
if (count > 0)
{
this.Alert("你成功删除了" + count + "条数?, this.Page);
this.BindGvSupplier();
}
}



2007-05-18 23:41 发表评论
]]>
q用asp2.0创徏和用三层数据架?C#)--【第一:介之建立数据讉K层?http://www.aygfsteel.com/zengke/articles/104741.htmlMon, 19 Mar 2007 07:20:00 GMThttp://www.aygfsteel.com/zengke/articles/104741.htmlhttp://www.aygfsteel.com/zengke/comments/104741.htmlhttp://www.aygfsteel.com/zengke/articles/104741.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/104741.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/104741.html阅读全文

2007-03-19 15:20 发表评论
]]>
|页防刷新重复提交、防后退解决Ҏhttp://www.aygfsteel.com/zengke/articles/89283.htmlThu, 21 Dec 2006 06:46:00 GMThttp://www.aygfsteel.com/zengke/articles/89283.htmlhttp://www.aygfsteel.com/zengke/comments/89283.htmlhttp://www.aygfsteel.com/zengke/articles/89283.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/89283.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/89283.html 提交后禁用提交按钮(大部分h都是q样做的Q?/font>

如果客户提交?按F5h怎么?

使用Session

在提交的面也就是数据库处理之前Q?/font>

 

if session("ok")=true then
   response.write "错误Q正在提?
   response.end
end if


数据处理完后Q修改session("ok")=false?/p>

数据处理成功马上Redirect到另外一个页?/p>

操作后刷新的是个问题,你可以用蟩转页面、关闭本面Q如果是有参数据条g来控制的Q那应该好做了Q可以直接修改window.location的|把参数全部改掉,q样差不多了?

~点Q简单地q用Response.Redirect不再有效,因ؓ用户从一个页面{到另一个页面,我们都必ȝ客户端代码清除location.history。注意,q种Ҏ清除的是最后一个访问历史记录,而不是全部的讉K记录?点击后退按钮Q再点击后退按钮Q你可以看到q时打开的是本页面之前的面Q(当然Q这是在你的客户端启用了JavaScript功能的条件下。)

如果客户按后退Q怎么办?

防止|页后退--止~存

我们在进行数据库d操作的时候,如果允许后退Q而正巧有h了页面,׃再次执行d操作Q无疑这不是我们需要的Q像一般网上很多禁止缓存的代码Q有时ƈ不可靠,q时你只要在操作的页面加上就可以了,在网늚里指定要定向的新,再点后退Q看是不是不会再退到刚才的操作面了,实际上已l把q个历史l删除了

ASPQ?br />Response.Buffer = True   
Response.ExpiresAbsolute = Now() - 1   
Response.Expires = 0   
Response.CacheControl = "no-cache"

ASP.NETQ?br />Response.Buffer=true;
Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1);
Response.Expires=0;
Response.CacheControl="no-cache";

I竟怎样才能"用"览器的后退按钮Q或者“怎样才能防止用户点击后退按钮q回以前览q的面Q?/p>

遗憾的是Q我们无法禁用浏览器的后退按钮?/p>

防止|页后退--新开H口

用window.open弹出表单面Q点提交后关闭该;处理提交的ASP也是用弹出Q设定表单的target,Ҏ交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close()Q?br />单的_是提交表单的时候弹出新H口Q关闭本H口。对于window.open()打开的窗口怎么后退Q能后退到哪里去Q?/p>

呵呵Q罗嗦了一堆废话,知道怎么处理了么Q؜合运用客L脚本和服务器端脚本?br />

 



2006-12-21 14:46 发表评论
]]>
Visual Studio .NET文g格式一?/title><link>http://www.aygfsteel.com/zengke/articles/81464.html</link><dc:creator>曄</dc:creator><author>曄</author><pubDate>Thu, 16 Nov 2006 02:57:00 GMT</pubDate><guid>http://www.aygfsteel.com/zengke/articles/81464.html</guid><wfw:comment>http://www.aygfsteel.com/zengke/comments/81464.html</wfw:comment><comments>http://www.aygfsteel.com/zengke/articles/81464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zengke/comments/commentRss/81464.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zengke/services/trackbacks/81464.html</trackback:ping><description><![CDATA[ <font size="2">.slnQ解x案文Ӟx案资源管理器提供昄理文g的图形接口所需的信息?<br />.csproj:目文gQ创建应用程序所需的引用、数据连接、文件夹和文件的信息?<br />.aspxQWeb H体는两部分组成:视觉元素QHTML、服务器控g和静态文本)和该늚~程逻辑。Visual Studio 这两个l成部分分别存储在一个单独的文g中。视觉元素在.aspx 文g中创建?<br />.aspx.csQWeb H体늚~程逻辑位于一个单独的cL件中Q该文gUC代码隐藏cLӞ.aspx.csQ?<br />.csQ?cL块代码文件。业务逻辑处理层的代码?<br />.asaxQGlobal.asax 文gQ也叫做 ASP.NET 应用E序文gQ是一个可选的文gQ该文g包含响应 ASP.NET ?HTTP 模块引发的应用程序别事件的代码?<br />.configQWeb.config 文g向它们所在的目录和所有子目录提供配置信息?<br />.aspx.resx/.resxQ资源文Ӟ资源是在逻辑上由应用E序部v的Q何非可执行数据。通过在资源文件中存储数据Q无需重新~译整个应用E序卛_更改数据?<br />.XSD:XML schema的一U?从DTD,XDR发展到XSD <br />.pdb:PDBQ程序数据库Q文件保持着调试和项目状态信息,从而可以对E序的调试配|进行增量链接?<br />.suo:解决Ҏ用户选项,记录所有将与解x案徏立关联的选项Q以便在每次打开Ӟ它都包含您所做的自定义设|?<br />.asmx:asmx 文g包含 WebService 处理指oQƈ用作 XML Web services 的可d入口?<br />.vsdiscoQ项目发玎ͼ文g Z XML 的文Ӟ它包含ؓ Web 服务提供发现信息的资源的链接 (URL)?<br />.htc:一个HTML文g,包含脚本和定义组件的一pdHTC特定元素.htc提供在脚本中implementlg的机?<br />.ascx 是用h件代码文?br />.aspx webform html脚本文g<br />.cs 是c#cL?<br />.vb 是vbcL?<br />.aspx.cs 和你的webform相关的后台c#代码文g,?cs<br />.aspx.vb 和你的webform相关的后台VB代码文g,?vb</font> <p> <font color="#000000"> </font> </p> <img src ="http://www.aygfsteel.com/zengke/aggbug/81464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zengke/" target="_blank">曄</a> 2006-11-16 10:57 <a href="http://www.aygfsteel.com/zengke/articles/81464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET中文件上传下载方法集?/title><link>http://www.aygfsteel.com/zengke/articles/76765.html</link><dc:creator>曄</dc:creator><author>曄</author><pubDate>Mon, 23 Oct 2006 07:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/zengke/articles/76765.html</guid><wfw:comment>http://www.aygfsteel.com/zengke/comments/76765.html</wfw:comment><comments>http://www.aygfsteel.com/zengke/articles/76765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zengke/comments/commentRss/76765.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zengke/services/trackbacks/76765.html</trackback:ping><description><![CDATA[ <p>文g的上传下载是我们在实际项目开发过E中l常需要用到的技术,q里l出几种常见的方法,本文主要内容包括Q?</p> <p>  1、如何解x件上传大的限制 </p> <p>  2、以文g形式保存到服务器 </p> <p>  3、{换成二进制字节流保存到数据库以及下蝲Ҏ </p> <p>  4、上传Internet上的资源 </p> <p>  W一部分Q?</p> <p>  首先我们来说一下如何解决ASP.net中的文g上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大限制ؓ2MQ一般情况下Q我们可以采用更改Web.Config文g来自定义最大文件大,如下Q?</p> <p>  q样上传文g的最大值就变成?MQ但q样q不能让我们无限的扩?MaxRequestLength的|因ؓASP.NET会将全部文g载入内存后,再加以处理。解决的Ҏ是利用隐含的 HttpWorkerRequestQ用它的GetPreloadedEntityBody和ReadEntityBodyҎ从IIS为ASP.NET 建立的pipe里分块读取数据。实现方法如下: </p> <p>IServiceProvidERProvider=(IServiceProvider)HttpContext.Current; <br />HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); <br />byte[]bs=wr.GetPreloadedEntityBody(); <br />. <br />if(!wr.IsEntireEntityBodyIsPreloaded()) <br />{ <br /> intn=1024; <br /> byte[]bs2=newbyte[n]; <br /> while(wr.ReadEntityBody(bs2,n)>0) <br /> { <br />  .. <br /> } <br />} </p> <p>  q样可以解决了大文件的上传问题了?</p> <p>  W二部分Q?/p> <p>  下面我们来介l如何以文g形式客L的一个文件上传到服务器ƈq回上传文g的一些基本信息?</p> <p>  首先我们定义一个类Q用来存储上传的文g的信息(q回旉要)?</p> <p>public class FileUpLoad <br />{ <br /> public FileUpLoad() <br /> {} <br /> /**//// <br /> /// 上传文g名称 <br /> /// BR> public string FileName <br /> { <br />  get <br />  { <br />   return fileName; <br />  } <br />  set <br />  { <br />   fileName = value; <br />  } <br /> } <br /> private string fileName; </p> <p> /**//// <br /> /// 上传文g路径 <br /> /// BR> public string FilePath <br /> { <br />  get <br />  { <br />   return filepath; <br />  } <br />  set <br />  { <br />   filepath = value; <br />  } <br /> } <br /> private string filepath; </p> <p> /**//// <br /> /// 文g扩展?<br /> /// BR> public string FileExtension <br /> { <br />  get <br />  { <br />   return fileExtension; <br />  } <br />  set <br />  { <br />   fileExtension = value; <br />  } <br /> } <br /> private string fileExtension; <br />} </p> <p>  另外我们q可以在配置文g中限制上传文件的格式(App.Config)Q?/p> <p>Q?XML version="1.0" encoding="gb2312" ?> <br />QApplication> <br />QFileUpLoad><br />QFormat>.jpg|.gif|.png|.bmp<br />Q?FileUpLoad> <br />Q?Application></p> <p>  q样我们可以开始写我们的上传文件的Ҏ了,如下Q?</p> <p>public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom) <br />{ <br /> FileUpLoad fp = new FileUpLoad(); <br /> string fileName,fileExtension; <br /> string saveName; </p> <p> // <br /> //建立上传对象 <br /> // <br /> HttpPostedFile postedFile = InputFile.PostedFile; </p> <p> fileName = System.IO.Path.GetFileName(postedFile.FileName); <br /> fileExtension = System.IO.Path.GetExtension(fileName); </p> <p> // <br /> //Ҏcd定文g格式 <br /> // <br /> AppConfig app = new AppConfig(); <br /> string format = app.GetPath("FileUpLoad/Format"); </p> <p> // <br /> //如果格式都不W合则返?<br /> // <br /> if(format.IndexOf(fileExtension)==-1) <br /> { <br />  throw new ApplicationException("上传数据格式不合?); <br /> } </p> <p> // <br /> //Ҏ日期和随机数生成随机的文件名 <br /> // <br /> if(myfileName != string.Empty) <br /> { <br />  fileName = myfileName; <br /> } </p> <p> if(isRandom) <br /> { <br />  Random objRand = new Random(); <br />  System.DateTime date = DateTime.Now; <br />  //生成随机文g?<br />  saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString() + date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100); <br />  fileName = saveName + fileExtension; <br /> } </p> <p> string phyPath = HttpContext.Current.Request.MapPath(filePath); </p> <p> //判断路径是否存在,若不存在则创\?<br /> DirectoryInfo upDir = new DirectoryInfo(phyPath); <br /> if(!upDir.Exists) <br /> { <br />  upDir.Create(); <br /> } </p> <p> // <br /> //保存文g <br /> // <br /> try <br /> { <br />  postedFile.SaveAs(phyPath + fileName); </p> <p>  fp.FilePath = filePath + fileName; <br />  fp.FileExtension = fileExtension; <br />  fp.FileName = fileName; <br /> } <br /> catch <br /> { <br />  throw new ApplicationException("上传p|!"); <br /> } </p> <p> //q回上传文g的信?<br /> return fp; <br />} </p> <p>  然后我们在上传文件的时候就可以调用q个Ҏ了,返回的文g信息保存到数据库中,至于下蝲Q就直接打开那个路径OK了?</p> <p>  W三部分Q?/p> <p>  q里我们主要说一下如何以二进制的形式上传文g以及下蝲。首先说上传Q方法如下: </p> <p>public byte[] UpLoadFile(HtmlInputFile f_IFile) <br />{ <br /> //获取由客L指定的上传文件的讉K <br /> HttpPostedFile upFile=f_IFile.PostedFile; <br /> //得到上传文g的长?<br /> int upFileLength=upFile.ContentLength; <br /> //得到上传文g的客LMIMEcd <br /> string contentType = upFile.ContentType; <br /> byte[] FileArray=new Byte[upFileLength]; </p> <p> Stream fileStream=upFile.InputStream; </p> <p> fileStream.Read(FileArray,0,upFileLength); <br /> return FileArray; <br />} </p> <p>  q个Ҏq回的就是上传的文g的二q制字节,q样我们可以将它保存到数据库了。下面说一下这UŞ式的下蝲Q也怽会想到这U方式的下蝲是新徏一?aspx面Q然后在它的Page_Load()事g里取Zq制字节,然后再读出来可以了Q其实这U方法是不可取的Q在实际的运用中也许会出现无法打开某站点的错误Q我一般采用下面的ҎQ?</p> <p>  首先Q在Web.config中加入: </p> <p>Qadd verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/></p> <p>  q表C我打开openfile.aspxq个面Ӟpȝ׃自动转到执行RuixinOA.Web.BaseClass.OpenFile q个c里的方法,具体实现如下Q?</p> <p>using System; <br />using System.Data; <br />using System.Web; <br />using System.IO; <br />using Ruixin.WorkFlowDB; <br />using RXSuite.Base; <br />using RXSuite.Component; <br />using RuixinOA.BusinessFacade; </p> <p>namespace RuixinOA.Web.BaseClass <br />{ <br /> /**//// <br /> /// NetUFile 的摘要说明?<br /> /// BR> public class OpenFile : IHttpHandler <br /> { <br />  public void ProcessRequest(HttpContext context) <br />  { <br />   //从数据库中取下蝲的文件信?<br />   RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager(); <br />   EntityData data = os.GetFileDetail(id); </p> <p>   if(data != null && data.Tables["RX_OA_File"].Rows.Count >0) <br />   { <br />    DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0]; <br />    context.Response.Buffer = true; <br />    context.Response.Clear(); <br />    context.Response.ContentType = dr["CContentType"].ToString(); <br />    context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString())); <br />    context.Response.BinaryWrite((Byte[])dr["CContent"]); <br />    context.Response.Flush(); <br />    context.Response.End(); <br />   } <br />  } <br />  public bool IsReusable <br />  {   <br />   get { return true;} <br />  } <br /> } <br />} </p> <p>  执行上面的方法后Q系l会提示用户选择直接打开q是下蝲。这一部分我们p到这里?</p> <p>  W四部分Q?/p> <p>  q一部分主要说如何上传一个Internet上的资源到服务器?</p> <p>  首先需要引?System.Net q个命名I间Q然后操作如下: </p> <p>HttpWebRequest hwq = (HttpWebRequest)WebRequest.Create("<a href="http://localhost/pwtest/webform1.aspx">http://localhost/pwtest/webform1.aspx</a>"); <br />HttpWebResponse hwr = (HttpWebResponse)hwq.GetResponse(); <br />byte[] bytes = new byte[hwr.ContentLength]; <br />Stream stream = hwr.GetResponseStream(); <br />stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength)); <br />//HttpContext.Current.Response.BinaryWrite(bytes); </p> <p>  HttpWebRequest 可以从Internet上读取文Ӟ因此可以很好的解册个问题?<br /></p> <img src ="http://www.aygfsteel.com/zengke/aggbug/76765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zengke/" target="_blank">曄</a> 2006-10-23 15:28 <a href="http://www.aygfsteel.com/zengke/articles/76765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创徏ASP.NET目时报Qhttp://1.1 400 bad Request错误http://www.aygfsteel.com/zengke/articles/75552.htmlTue, 17 Oct 2006 02:25:00 GMThttp://www.aygfsteel.com/zengke/articles/75552.htmlhttp://www.aygfsteel.com/zengke/comments/75552.htmlhttp://www.aygfsteel.com/zengke/articles/75552.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/75552.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/75552.html(1)  
Asp.net在テQS中重新注册  ?br />cd   C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322   
aspnet_regiis   -i   
(2)   
IIS理器中,“默认网站”-“属性”-“网站”,“テQ地址”改为“(全部未分配)” ?
(3)  
点击“DQ服务扩展”,“ASP.NET   v1.1.4322   ”改为“允许”?/font>

2006-10-17 10:25 发表评论
]]>
三层式开发中的层ơ划分讨论[转自QCSDN_lubosun(大白?]http://www.aygfsteel.com/zengke/articles/75371.htmlMon, 16 Oct 2006 03:17:00 GMThttp://www.aygfsteel.com/zengke/articles/75371.htmlhttp://www.aygfsteel.com/zengke/comments/75371.htmlhttp://www.aygfsteel.com/zengke/articles/75371.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/75371.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/75371.html先D一个曾l在哪本书上看到的例子:现在你想?c_的小溪上Z座桥Q你会在上面攑֝木板完了。如果想在宽一点的河上徏q桥Q你需要计木材用料,h{,如果需要别人帮忙,你还要多一些图U总么的让别人理解你的想法。现在你要在大江上面建桥Q你需要有整体的计划,包括各个斚wQ比如将来可能的收费和利益分配等问题?
q里?层式Q其实是针对“大江上面徏桥”来的,对于1c_的小溪,在实际中可能一点用都没有。不q现在我不可能去拿个长江大桥作例子来Ԍ所以这里还是用q条单的溪Q讲讲怎么建桥。之所以讲q么多废话,是ؓ了防止部分h看完此文之后“小一个东西,搞那么麻烦干什么。。”其实这里讲的不是具体的q个例子Q而是分层的思想Q理解这炚w帔R要?
下面我就我们大家日常见最多的例子来讲Q就是“用L录”的例子。这个例子很单,但是麻雀虽小五脏俱全。从数据讉KC务规则到界面全有了?
本文?个部分,如果只想研究面向对象的思想Q对实现已经熟悉Q可以蟩q第一部分?
W一部分
新徏一个空白解x案。然后:
“添加”-“新建项目”-“其他项目”-“企业模版目”-“C#生成块”-“数据访问”(数据层,下简UD层)
“添加”-“新建项目”-“其他项目”-“企业模版目”-“C#生成块”-“业务规则”(业务层,下简UC层)
“添加”-“新建项目”-“其他项目”-“企业模版目”-“C#生成块”-“Web用户界面”(界面层,下简UU层)
右键点“解x案”-“项目依赖项”,讄U依赖于D、CQC依赖于D?
对Ud引用D、CQ对Cd引用D?
到此为止Q一个三层的架子建立h了。我上面说的很具体很“傻瓜”,知道的h觉得我废话,其实我这D|间很强烈的感觉到非常多的人其实对q个单的q程完全不了解。虽然不反对?个“空目”和1个“Asp net Web应用E序目”也可以作ؓ3层的框架Q而且相当多的为其实这些“企业模板目”其实就是个I项目,q是一个误区。没错,企业U模杉K目你从解x案资源管理器里看它是个什么也没有的,但是你可以用C本打开目文gQ看见不同了吧?Q有些东西在背后Q你是看不见的,不过pȝ已经做好了。也是_如果你在C层里的某个类里“using System Data SqlClineit”,或者用一个SqlConnection对象Q编译时候不会出错,但是会在“Q务列表”里生成一些“策略警告”,警告你在C层里不要攑ֺ该放在D层的东西Q虽然就E序来说没错Q但是可L可l护性就打了折扣Q而这U功能,I项目是无法i你的?
我们知道建桥需要砖块,应该是先准备好砖再来建桥Q不qؓ了讲解上的顺序性和q诏性,单性。我们先建桥Q徏的过E中需要砖块再现做Q这样就不会多出来“桥不需要的东西”。注意在实际中,q是应该先准备砖块?
U层其实就是桥QC层是砖块QD层是原料Q石头、沙子)。这也解释前面ؓ什么U层要引用、依赖D层(而不是U对CQC对D的层ơ)Q因为桥除了需要砖_其实也需要石头沙子?
我们在U层徏一个Login aspxQ这里插入一句,我不喜欢Lpȝ自动生成的WebForm1 aspx拿来Ҏlogin或index或直接删除,我一般留着它当试代码用,{到整个pȝȝ再把它移除就可以了。)d1个TextBoxQid=txtQ,一个DropDownListQid=ddlQ,一个Button(id=btn)。其中DropDownList用来选择用户名,button是提交按钮, TextBox用来输入密码?
现在我们必须要添加的代码分ؓ2部分Q?1、Page_load时对ddl的初始化?、btn的click处理?
1Q?
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
this.ddl.DataSourse=DataManager.GetOneColunm(“User?”uid?; //讲解1
this.ddl.DataBind();
}
}
2Q?
private void Btn_Click(object sender, System.EventArgs e)
{
 string uid=this.ddl.SelectedValue;
 string psw=this.txt.Text;
 if(psw =”?
  MessageBox(“空密码Q?;
 else
 {
  User theUser;
  try
  {
   theUser=new User(uid); //讲解2
  }
  catch(Exception e)
  {
 MessageBox(e. Message);//讲解2
 return;
}
if(theUser.CheckPsw(psw)) //讲解3
{
 theUser.SetSessions();
 Response.Redirect(“…………?.?;  //d成功Q?
}
else
{
 MessageBox(“密码错误!?; 
}
 }
}
讲解1QDataManager 是D层中的一个类Q提供常见的数据操作。GetOneColunm(string Table,string Colunm)Ҏq回一个只?列的DataTableQgؓ数据库中表名为TableQ的Colunm列?
public class DataManager
{
 public DataManager()
 {
 }
 public static DataTable GetOneColunm(string Table,string Colunm)
 {
  //此处省略相关代码。返回指定表指定?
 }
}
其实q个地方演示的是在U层直接绕qC层访问D层的例子Q因l构逻辑上很单,而且获取用户名ƈ不是现实C会中的业务逻辑的一部分Q仅仅是界面需要,因ؓ在这里其实用?个TextBox的话完全不需要这一步)
讲解2Q定义一个Usercȝ实例。Usercȝ定义可能如下Q?
public class User
{
 public User(string uid)
 {
  if(DataManager.IsIn(“user?”uid=?+uid+”’?)
   throw "用户不存?;
  else
   //User()其他初始?
 }
 public bool CheckPsw(string psw)
 {
  if(DataManager.IsIn(“user?”uid=?+uid+”?and psw=’?psw+”’?)
   return true;
  else
   return false;
 }
}
注意到用L构造函C用了个throw来抛出用户不存在的异常,在下面catch的时候用MessageBox(e. Message);来弹出“用户不存在”的错误。这里其实也是ؓ了演CZ个层间传递信息的手段Q异怹是一U手D,虽然在这里其实可以有其他方式比如q回|引用参数之类的直接用一个方法来获得用户是否存在的信息,没必要放在构造里Q我q么做只是ؓ了演CZ递过E,在后面的有讨U用法在分层模式下某U特D情늚应用以解决一些问题。这个类里又用了DataManagercȝ一个静态方法IsIn(string Table,string str)该方法其实其实是执行 “select * from Table where str?
q个Sql语句q在q回I的时候方法返回falseQ否则返回true。一个很单的Ҏ。这里演CZC层对D层的调用?
Z说一句,因ؓ在VS.Net中,目的名UC默认地成为项目中的namespaceQ可以通过把所有自动生成的代码中的namespace改ؓ“解x案名U”来?个层可以无缝地自p用。或者在调用的地方using一下其他层的空间名Q看个h喜欢了。比如上面的Login.aspx.cs里需要using2个,而User.cs里要using一个?
讲解3Q这里的查用户密码同L到Usercȝ一个方法CheckPswQ)而这个方?又用CIsInQ)q里׃多说了?
大家注意到我们在U层的面里用MessageBox()Ҏ来弹出对话框Q其实这个方法写在PageBase.cs里,是U层的另外一个文Ӟl承Pagec,Logincdl承它,q个Ҏ其实是把Response.Write(?lt;script>alert(\“? msg+“\?</script>?装h了?
到此为止Q登录结束,例子的实C说完了。不q只讲了“然”,没有讜y所以然”。下面开始讲“所以然”?
W二部分
作ؓҎQ我们用一个不面向对象的,不分层的Asp式的Aspx相同d作ؓҎ。具体的Asp代码我就不写了,反正d哪都有。先来看看他?者发生的遭遇Q这是不q的Q却偏偏是经常发生的Q:
1、?目l理H然说“不用SqlServer了,换成Access”(正版费用问题Q。看?边分别发生什么:3层这边(AQ,把DataManagerc里的连接改改(在实际情况下Q极可能其实是改它的基类Q它本n不用改)QWeb.config中把字符串换掉就完了。Asp式那边(BQ,同样要改Web.configQ同栯改连接什么的Q修攚w在这个具体的“小溪”例子上几乎相同Q在“大桥”例子上B应该会稍微多改点Q不q也不会多很多。但是!h意一点,我们在修改代码的时候,主要旉和精力不是花在“改”这个动作上Q而是花在“要改什么地方”上和“寻N要改的地方”上。在“大桥”上QB需要花费多的多的时_对大部分文gq行查找和替换。A则仅仅在数据层里Q另?个层不需要Q何修攏V从q个角度出发我们惛_2点原则:
a)    数据层必要能够保证数据库的变动QQ何结构变动、类型变动)对其余各层的不透明性。也是数据库怎么变,其他层绝对不应该变哪?行代码!Qweb.config是整个应用程序的配置Q虽然在物理上存在于U层的文g夹中Q但个h更愿意认为它是独立的不属于Q何层的,所以这里不计它Q?
b)    数据层越越好(如果没有q点原则Q我们把整个所有的东西都放在数据层Q那当然数据库变动对外面无媄响――因为外面几乎没东西――但是这昄不可行)。而且因ؓ前面我们说了Q大部分旉花在“找”上面,你小点,找v来也Ҏ炏V?
2、?客户H然提出B/S版的不好Q要换成C/S版的。对于(BQ来_q是晴天霚wQ!他的所有工作都要重新做Q(或者几乎所有工作)Q虽然他有很多代码还可以用,不过他在未来一段旉必M断在“复Ӟ_脓”中使用以前的代码。(AQ发生了什么?Q如果你l心看会发现QAQ之需要新Z目“Windows用户界面”(和前面一Pd引用Q项目依赖)Q拖几个控gC面,把控件名字v成txtQddlQbtnQ然后把click代码和Pageload代码复制q去Q(居然。。。)q?行代码都不需要修改!Q!Q当Ӟq是比较极端的例子(win和web都有TextBoxQDropDownListQButton3U控Ӟ而且我们在PageBase里定义的ҎMessageBox()又刚好和win里面Ҏ同名。。。)不过管有这么多巧合我们仍然可以也愿意相信,在“大桥”上Q(AQ将比(BQ少做很多工作。从q个角度出发我们又想?点类似原则:
a)    界面层应该保证界面的M变化都不需要修改其他层的内容(不管q个具体的例子把ddl改ؓ另外一个TextBoxQ或是把B/S改ؓC/SQ?
b)    界面层越越好(理由同上。)
3、?除开了界面层和数据层Q(如果你的Ҏ中只?个层的话Q剩下的都是逻辑层的内容了。所以和前面的相对应Q我们可以得出结论:
a)    逻辑层应当不受数据库和界面变动的影响而需要修攏V?
b)    逻辑层越大越好(因ؓ另外2层越越好。。。)
有了最基本的原则,我们应该来讨ZQ根据原则,要怎么分层的问题:
1、?PageBase.cs 应该攑֜哪个层?Ҏ上面的原则,应该攑֜C层。但是实际上我习惯放在U层,或者放在另外一个(W?个层Q通用底层Q在比数据层q低的位|)层里。到底放在什么地方,我最开始的做法是在C层,因ؓ按上面归U的原则Q就应该攑֜CQ但是后来一D|间我习惯于“四层式”之后就把它攑֜通用底层Q下UB层,该层同时也放如本来在D层中的SqlHelpercȝQ包括原?层中所有“通用”的c,q里通用的意思是说其他系l也可以用的到而不需要修改,q个层通常不用解决Ҏ名称而用公司、小l名U等作ؓnamespaceQ在有新目的时候在x案的时候就可以“添加现有项目”,单的加进dƈ不断U篏Q实践中Ҏ高效率和代码重用有比较大作用。)不过如果只有3层,我现在們֐于把PageBase攑֜U层。主要因为最q一D|心研I向对象的分析设计的心得。说h又是一大匹布没完,不过我又在前面的“原则”上?条:“如果某个类Q仅Z某层的某U特D实现而存在,那么它必L在该层”,比如PageBase是ؓ了U层的Ҏ实现QB/S实现Q而存在,又比如SqlHelper是ؓ了D层的Ҏ实现QSqlServer数据库)而存在。所以对应的Q它们必d别放在U层和D层(如果不加q条的话按前面他们都该放在C层,因ؓC层越大越好,而且数据库和界面的变动不需要改动这2个类Q虽然它们可能因改动而没有用了,不过q是不需要去修改它们Q?
2、?Oldjacky曄和我谈到一个问题:Datagrid中允怽删除操作Q但是如果当前仅余下最后一条记录,则不允许q个删除操作Q那么该删除应该攑֜C层还是D层还是U层?我觉得应该从另外一个角度来考虑Q?
a)    q种“不允许”是“业务规则的不允许”(比如表内的数据表C当前在店里的职员,删除表示职员d店里Q可能去拿货什么的Q添加表C员回来,当柜台只有一名职员时Q显然他l对不能d去送货Q,q个时候,此“禁止删除”的操作应该产生在C层?
b)    q种“不允许”是“程序实现的不允许”(比如当这里ؓI的时候会引v其他地方比如ToString()Ҏ产生“未对象的引用讄到对象的实例……”的错误Q或E序设计者或目l理的主观愿望希望它“不允许”以此来减少工作量或化程序)。这个时候,此“禁止删除”可以放在U层(比如上面说的ToStringQ或D层(比如q反数据库约束)
3、?l心的h可能会发玎ͼ前面的登录例子里Q用户一共可以获?U弹出错误分别是“空密码”“密码错误”“用户不存在”,而其中前2个是在U层里做的Q“用户不存在”却是在C层里做的Q我是指q个字符Ԍq是开始说的徏桥,我这里是用“小溪徏桥”来讲解“大江徏桥”所以故意在q里转了个没用的圈,像在计小溪上q块木板到底够用多少q_其实对小溪没什么意义,只是Z讲解大桥需要而加上去的,毕竟大桥需要这U考虑。我q里假设“用户不存在需要弹出提C”是一U业务逻辑上的需要,而“未输入密码需要提C”则不是业务规则需要(比如实际业务中可以允许空密码Q但是项目经理不同意Q说一定要密码Q在q个d例子中其实根本没有什么问题,但是在大目里,如果q个东西不是业务规则的需要,׃应该攑֜业务层,如果是一U业务规则,p攑֜业务层。有助于业务模型与现实实体的衔接Q也有益于业务逻辑更好地表现现实实体的特征?
到此为止Q我再次归纳出我们的最l的原则Q?
1、?如果某个c,仅ؓ了某层的某种Ҏ实现而存在,那么它必L在该层?
2、?数据层应当在保证数据库变化对其他层不可见的前提下量?
3、?界面层应当在保证界面变化对业务逻辑层不影响的前提下量?
4、?如果某个cM是业务规则的需要,׃应该攑֜业务层,反之亦然?
5、?逻辑层应当在保证数据库或界面变化不会造成自n影响的前提下量大?
以上5点如果发生冲H,在找q点的时候,前面的要高于后面的。比??冲突的时候更們֐于用规??
W二部分l束
有一点应该是“编E代码习惯”和“面向对象”的范畴Q不q因为和分层有些关系Q所以也说一下。“如果你的代码,自己把它译成中文ƈ加必要的标点W号后,其他不懂E序的h看了仍然觉得很ؕQ那么你很可能层没分好”。比如前面的btn的clickQ?
?
字符?用户名是 下拉?选择|
字符?密码?输入?|
如果 密码?I?
 对话框(密码I!Q;
否则
?
 用户 q用P
 试
?
 q用??新的 用户Q用户名Q;
?
捕捉Q错误)
?
 对话框(错误 消息Q;
 q回Q?
?
如果 q用h查密码(密码Q?
{
 q用?讄状态;
 响应 重定位(“。。。。。”)Q?
}
否则
{
 对话框(密码错误Q?
}
?
代码最好能让不懂的Z能看懂到底在q什么?
最后,oldjacky的Datagrid删除的例子“删除”显然在D层,但是不允许却可能在C或UQ如果在U没什么说的了Q如果在CQ那么这U“不允许”的一个比较合理的实现Ҏ是在C层里遇到q种情况throw一下。当U层里catch到该throw的时候,止删除操作Q这样当2个层同时有原因引L止时Q可以从代码一眼看U禁止的来源。类g前面?U弹出错误?
注:本文为原创,甚至在写本文的时候,q没有看M|页文章和书Q完全是一时之作,错误隑օQ而且q代码也是在写字板上打出来的Q所以不见得可以q行Q大写也可能有错。一口气写这么多Q行文很乱,废话也多Q请见谅Q?br />


2006-10-16 11:17 发表评论
]]>
վ֩ģ壺 Ľ| | ¸| ̨| | пѷ| | ׼| γ| ͭɽ| | ;| | | | | | | | ̽| | | | | | | º| ͷ| ¡| ɽ| | | | ͭ| մ| ˫| | | | | Ϫ|