局部刷新

局部刷新技术(2


一、XML文档 与 XML DOM

XML 文档

XML DOM (Document Object Model)

<?xml version="1.0" encoding="UTF-8" ?>

<课程>

<公共课 编号="C00001" 必修="false">

<名称 类型="string" 宽度="50">高等数学</名称>

<学分 类型="decimal">5.0</学分>

</公共课>

<公共课 编号="C00002" 必修="true">

<名称 类型="string" 宽度="50">体育</名称>

<学分 类型="decimal">4.0</学分>

</公共课>

<专业课 编号="C54001" 专业代码="54" 必修=true>

<名称 类型="string" 宽度="50">C#语言程序设计</名称>

<学分 类型="decimal">6.0</学分>

</专业课>

</课程>

课程 (XMLDOMElement)

 

 

公共课 (XMLDOMElement)

 

 

 

attributes (XMLDOMNamedNodeMap)

 

 

 

 

编号 (XMLDOMAttribute)

 

 

 

 

 

C00001 (XMLDOMText)

 

 

 

 

必修 (XMLDOMAttribute)

 

 

 

 

 

false (XMLDOMText)

 

 

 

名称 (XMLDOMElement)

 

 

 

 

attributes (XMLDOMNamedNodeMap)

 

 

 

 

 

类型 (XMLDOMAttribute)

 

 

 

 

 

 

string (XMLDOMText)

 

 

 

 

 

宽度 (XMLDOMAttribute)

 

 

 

 

 

 

50 (XMLDOMText)

 

 

 

 

高等数学 (XMLDOMText)

 

 

 

学分 (XMLDOMElement)

 

 

 

 

attributes (XMLDOMNamedNodeMap)

 

 

 

 

 

类型 (XMLDOMAttribute)

 

 

 

 

 

 

decimal (XMLDOMText)    

 

 

 

 

●5.0 (XMLDOMText)

 

 

公共课

 

 

 

attributes

 

 

 

 

编号

 

 

 

 

 

C00002

 

 

 

 

必修

 

 

 

 

 

true

 

 

 

名称

 

 

 

 

attributes

 

 

 

 

 

类型

 

 

 

 

 

 

string

 

 

 

 

 

宽度

 

 

 

 

 

 

50

 

 

 

 

体育

 

 

 

学分

 

 

 

 

attributes

 

 

 

 

 

类型

 

 

 

 

 

 

decimal

 

 

 

 

●4.0

 

 

专业课

 

 

 

attributes

 

 

 

 

编号

 

 

 

 

 

C54001

 

 

 

 

专业代码

 

 

 

 

 

54

 

 

 

 

必修

 

 

 

 

 

true

 

 

 

名称

 

 

 

 

attributes

 

 

 

 

 

类型

 

 

 

 

 

 

string

 

 

 

 

 

宽度

 

 

 

 

 

 

50

 

 

 

 

●C#语言程序设计

 

 

 

学分

 

 

 

 

attributes

 

 

 

 

 

类型

 

 

 

 

 

 

decimal

 

 

 

 

●6.0

● -- node(节点)

二、XML DOM Document 对象成员

1、常用 Document 对象属性

属性

描述

IE

Firefox

Opera

W3C

childNodes

返回属于文档的子节点节点列表

5

1

9

Yes

documentElement

返回文档的根节点

5

1

9

Yes

firstChild

返回文档的首个子节点

5

1

9

Yes

lastChild

返回文档的最后个子节点。

5

1

9

Yes

nodeName

依据节点的类型返回其名称。

5

1

9

Yes

nodeType

返回节点的节点类型。

5

1

9

Yes

nodeValue

根据节点的类型来设置或返回节点的值。

5

1

9

Yes

text

返回节点及其后代的文本(仅用于 IE)。

5

No

No

No

2、常用 Document 对象方法

方法

描述

IE

Firefox

Opera

W3C

getElementById()

查找具有指定的唯一 ID 的元素。

5

1

9

Yes

getElementsByTagName()

返回所有具有指定名称的元素节点。

5

1

9

Yes

三、XML DOM Element 对象成员

1、常用 Element 对象属性

属性

描述

IE

Firefox

Opera

W3C

attributes

返回元素的属性的 NamedNodeMap

5

1

9

Yes

childNodes

返回元素的子节点的 NodeList

5

1

9

Yes

firstChild

返回元素的首个子节点

5

1

9

Yes

lastChild

返回元素的最后个子节点

5

1

9

Yes

nextSibling

返回元素之后紧跟的节点

5

1

9

Yes

nodeName

返回节点的名称,依据其类型。

5

1

9

Yes

nodeType

返回节点的类型

5

1

9

Yes

ownerDocument

返回元素所属的根元素 (document 对象)

5

1

9

Yes

parentNode

返回元素的父节点

5

1

9

Yes

previousSibling

返回元素之前紧随的节点

5

1

9

Yes

tagName

返回元素的名称

5

1

9

Yes

textContent

设置或返回元素及其后代的文本内容

No

1

No

Yes

text

返回节点及其后代的文本 (IE-only)

5

No

No

No

2、常用 Element 对象方法

方法

描述

IE

Firefox

Opera

W3C

getAttribute()

返回属性的值。

5

1

9

Yes

getElementsByTagName()

找到具有指定标签名的子孙元素。

5

1

9

Yes

hasChildNodes()

返回元素是否拥有子节点。

5

1

9

Yes

四、Node 对象成员

1、常用 Node 对象属性

属性

描述

IE

Firefox

Opera

W3C

childNodes

返回节点到子节点的节点列表。

5

1

9

Yes

firstChild

返回节点的首个子节点。

5

1

9

Yes

lastChild

返回节点的最后个子节点。

5

1

9

Yes

nextSibling

返回节点之后紧跟的同级节点。

5

1

9

Yes

nodeName

返回节点的名称,根据其类型。

5

1

9

Yes

nodeType

返回节点的类型。

5

1

9

Yes

nodeValue

设置或返回节点的值,根据其类型。

5

1

9

Yes

ownerDocument

返回节点的根元素(document 对象)。

5

1

9

Yes

parentNode

返回节点的父节点。

5

1

9

Yes

previousSibling

返回节点之前紧跟的同级节点。

5

1

9

Yes

textContent

设置或返回节点及其后代的文本内容。

No

1

No

Yes

text

返回节点及其后代的文本(IE 独有的属性)。

5

No

No

No

2、常用 Node 对象方法

方法

描述

IE

Firefox

Opera

W3C

hasAttributes()

判断当前节点是否拥有属性。

No

1

9

Yes

hasChildNodes()

判断当前节点是否拥有子节点。

5

1

9

Yes

五、NodeList 对象成员

1、常用 NodeList 对象属性

属性

描述

IE

Firefox

Opera

W3C

length

可返回节点列表中的节点数目。

5

1

9

Yes

2、常用 NodeList 对象方法

方法

描述

IE

Firefox

Opera

W3C

item()

可返回节点列表中处于指定的索引号的节点。

5

1

9

Yes

六、Text 对象成员

常用 Text 对象属性>

属性

描述

IE

Firefox

Opera

W3C

data

设置或返回元素或属性的文本

6

1

9

Yes

length

返回元素或属性的文本长度

6

1

9

Yes

七、NamedNodeMap 对象成员

1、常用 NamedNodeMap 对象属性

属性

描述

IE

Firefox

Opera

W3C

length

可返回列表中的节点数目

5

1

9

Yes

2、常用 NamedNodeMap 对象方法

方法

描述

IE

Firefox

Opera

W3C

getNamedItem()

可返回指定的节点(通过名称)

5

1

9

Yes

item()

可返回处于指定索引号的节点

5

1

9

Yes

八、Attr 对象成员

常用 Attr 对象的属性

属性

描述

IE

Firefox

Opera

W3C

isId

如果属性是 id 类型,则返回 true,否则返回 false

No

No

No

Yes

name

返回属性的名称。

5

1

9

Yes

nodeName

返回节点的名称,依据其类型。

5

1

9

Yes

nodeType

返回节点的类型。

5

1

9

Yes

nodeValue

设置或返回节点的值,依据其类型。

5

1

9

Yes

ownerDocument

返回属性所属的根元素(document对象)。

5

1

9

Yes

ownerElement

返回属性所附属的元素节点。

No

1

9

Yes

textContent

设置或返回属性的文本内容。

No

1

9

Yes

text

返回属性的文本。IE-only

5

No

No

No

value

设置或返回属性的值。

5

1

9

Yes

 

九、应用实例

【例1】将开头的XML文件显示成下列表格

课程编号

课程名称

学分

开设专业

必修

C00001

高等数学

5.0

 

C00002

体育

4.0

 

C54001

C#语言程序设计

6.0

54

 

<script language=javascript>

req = null;

function reqXML()

{

req = null;

if (window.XMLHttpRequest)

req = new XMLHttpRequest();

else if (window.ActiveXObject)

req = new ActiveXObject("MSXML2.XMLHTTP");

if (!req) return;

req.onreadystatechange=makeTable;

req.open("GET", "WebForm2.aspx", true);

req.send(null);

}

function makeTable()

{

if (!req || req.readyState!=4 || req.status!=200) return;

var xml = req.responseXML;

req = null;

var tb = document.createElement("table");

tb.border = tb.cellSpacing = tb.cellPadding = 1;

var c = ["课程编号","课程名称","学分","开设专业","必修"];

with(tb.insertRow())

for(var i=0; i<c.length; i++)

with (insertCell())

innerText=c[i];

var root = xml.documentElement;

for(var i=0; i<root.childNodes.length; i++)

{

var courseNode = root.childNodes[i];

var tr = tb.insertRow();

var node = courseNode.attributes.getNamedItem("编号");

var td = tr.insertCell();

td.innerText = node ? node.nodeValue : " ";

node = getChildNodeByName(courseNode,"名称");

td = tr.insertCell();

td.innerText = node ? node.firstChild.data : " ";

node = getChildNodeByName(courseNode,"学分");

td = tr.insertCell();

td.innerText = node ? node.firstChild.data : " ";

node = courseNode.attributes.getNamedItem("专业代码");

td = tr.insertCell();

td.innerText = node ? node.nodeValue : " ";

node = getAttributeByName(courseNode, "必修");

td = tr.insertCell();

td.innerText = node && node.nodeValue=="true" ? "": "";

}

container.appendChild(tb);

}

function getChildNodeByName(node, name)

{

for(var i=0; i<node.childNodes.length; i++)

if (node.childNodes.item(i).nodeName == name)

return node.childNodes.item(i);

return null;

}

function getAttributeByName(node, name)

{

for(var i=0; i<node.attributes.length; i++)

if (node.attributes.item(i).nodeName == name)

return node.attributes.item(i);

return null;

}

</script>

【例2】将上一节的【例2】改用 XML DOM 方式

GetPage.aspx 页面

int pageSize = 20;

private void Page_Load(object sender, System.EventArgs e)

{

this.Response.Expires = -1;

string pg = this.Request.QueryString["pg"];

int ipg = 1;

try

{

ipg = int.Parse(pg);

}

catch{}

daArticles.Fill(ds, (ipg-1)*pageSize, pageSize,"Articles");

 

this.Response.ContentType = "text/xml";

this.Page.Controls.Clear();

this.Response.Write(@"<?xml version=""1.0"" encoding=""utf-8""?>");

this.Response.Write("<articles>");

foreach(DataRow dr in ds.Articles)

{

this.Response.Write("<article>");

    this.Response.Write("<id>");

        this.Response.Write(dr["id"].ToString());

    this.Response.Write("</id>");

 

    this.Response.Write("<title>");

        this.Response.Write(Server.HtmlEncode(dr["title"].ToString()));

    this.Response.Write("</title>");

//...

this.Response.Write("</article>");

}

this.Response.Write("</articles>");

}

Subject.aspx 页面

function writePage()

{

if (!req || req.readyState!=4 || req.status != 200) return;

var xml = req.responseXML;

req = null;

var tb = document.createElement("table");

var a = xml.getElementsByTagName("article"); // article's nodes list

for(var i=0; i<a.length; i++)

{

var tr = tb.insertRow();

var td = tr.insertCell();

var lnk = document.createElement("a");

lnk.href = "article.aspx?id="+a[i].childNodes[0].firstChild.data; // id

lnk.innerHTML = a[i].childNodes[1].firstChild.data; // title

td.appendChild(lnk);

//...

}

a = xml.getElementsByTagName("btn"); // btn's nodes list

var f = a[0].firstChild.data;

var t = a[1].firstChild.data;

// 生成 f t 的导航按钮

//-------------------

while (mainview.firstChild)

mainview.removeChild(mainview.firstChild);

mainview.appendChild(tb);

}

 

 实现多选记录的指定操作

在进行数据库维护时,有时需要由用户根据列表选出多条记录进行操作,例如:

 

产品名称

规格

库存量

Chai

10 boxes x 20 bags

39

Chang

24 - 12 oz bottles

17

Aniseed Syrup

12 - 550 ml bottles

13

Chef Anton's Cajun Seasoning

48 - 6 oz jars

53

Chef Anton's Gumbo Mix

36 boxes

0

上一页

下一页

删除选定记录

修改选定记录

 

 

产品名称

规格

库存量

Chai

10 boxes x 20 bags

39

Aniseed Syrup

12 - 550 ml bottles

13

上一页

下一页

确认删除选定记录

 

 

产品名称

规格

库存量

Chai

10 boxes x 20 bags

Aniseed Syrup

12 - 550 ml bottles

上一页

下一页

确认修改

一、生成能标识记录的表单元素(复选框、文本框等)

要让不同表单元素与产品记录一一对应,即标识不同产品,最好的办法是将产品的 ID 作为表单元素的“name”属性的一部分。为了区分不同(类型)的表单元素,需要在“name”属性前添加前缀,前缀与产品ID之间使用一个特殊字符(如“_”“$”等)分隔,以便拆取(见二)。

foreach (DataRow dr in DataRows)

{

// ...

System.Web.UI.WebControls.CheckBox cb = new CheckBox();

cb.ID = "Chk_" + dr["ProductID"].ToString();

// 服务器将自动生成与ID相同的 name 属性

// ...

 

TextBox tb = new TextBox();

tb.ID = "UIS_" + dr["ProductID"].ToString();

tb.Text = dr["UnitsInStock"].ToString();

// ...

}

二、获取用户选定要操作的记录

for (int i=0; i<Request.Form.Keys.Count; i++)

{

// 取得表单元素的“name”

string kn = Request.Form.Keys[i];

 

// 将其拆分成前缀产品ID”

string[] ChkID = kn.Split(new char[]{'_'});

 

// “name” 形如 前缀_nnn,则 nnn 为产品 ID

if (ChkID.Length == 2 && ChkID[0] == "Chk")

{

// 记录下 ChkID[1] ——产品ID,或对 ID ChkID[1] 的产品进行指定操作(删除/修改等)

}

}

三、完整实例

下载完整实例

default.aspx

1、样式表

<style type="text/css">

.DsBtn { COLOR:silver; TEXT-DECORATION:underline }

.EnBtn { CURSOR:hand; COLOR:blue; TEXT-DECORATION:underline }

</style>

2、客户端脚本

<script language="javascript" type="text/javascript">

//检测是否选定了记录

function CheckSelected()

{

var cc = 0;

for (var i=0; i<Form1.all.length; i++)

if (Form1.all[i].getAttribute("type") =="checkbox" && Form1.all[i].checked)

cc++;

return cc>0;

}

//操作存入“opr”并提交表单

function DoSubmit(o)

{

if (o == "DeleteRecs" || o == "ModifyRecs" || o == "ConfirmDeleteRecs")

{

if (!CheckSelected())

{

window.alert("请选定要删除/修改的记录。");

return

}

}

Form1.opr.value = o;

Form1.submit();

}

//单击复选框时,根据是否选定了记录来设置按钮的样式

function CheckOut()

{

var si = CheckSelected();

for (var i=0; i<document.all.length; i++)

if (document.all[i].id.indexOf("Btn") == 0)

document.all[i].className = si ? "EnBtn" : "DsBtn";

}

</script>

3、表单

<form id="Form1" method="post" runat="server">

<!-- 用于将要进行的用户操作传递给服务器 -->

<INPUT id="opr" type="hidden" name="opr">

<table>

<tr>

<td>

<asp:table id="ProductsList" runat="server" GridLines="Both">

<asp:TableRow>

<asp:TableCell>&nbsp;</asp:TableCell>

<asp:TableCell Text="产品名称"></asp:TableCell>

<asp:TableCell Text="规格"></asp:TableCell>

<asp:TableCell Text="库存量"></asp:TableCell>

</asp:TableRow>

</asp:table>

</td>

</tr>

<tr>

<td align="right">

<table cellspacing="10">

<tr>

<td id="PPBtn" runat="server" class="EnBtn" onclick="javascript:DoSubmit('PriorPage')">上一页</td>

<td id="NPBtn" runat="server" class="EnBtn" onclick="javascript:DoSubmit('NextPage')">下一页</td>

<td id="BtnDelSel" runat="server" class="DsBtn" onclick="javascript:DoSubmit('DeleteRecs')">删除选定记录</td>

<td id="BtnModSel" runat="server" class="DsBtn" onclick="javascript:DoSubmit('ModifyRecs')">修改选定记录</td>

<td id="BtnCfmDel" runat="server" class="DsBtn" onclick="javascript:DoSubmit('ConfirmDeleteRecs')">确认删除</td>

<td id="BtnCfmMod" runat="server" class="DsBtn" onclick="javascript:DoSubmit('ConfirmModifyRecs')">确认修改</td>

</tr>

</table>

</td>

</tr>

</table>

</form>

default.aspx.cs

public class _default : System.Web.UI.Page

{

protected System.Data.SqlClient.SqlConnection sqlConnection1;

protected Shop.dsProducts dsProducts1;

protected System.Web.UI.WebControls.Table ProductsList;

protected System.Web.UI.HtmlControls.HtmlTableCell BtnDelSel;

protected System.Web.UI.HtmlControls.HtmlTableCell BtnModSel;

protected System.Web.UI.HtmlControls.HtmlTableCell BtnCfmDel;

protected System.Web.UI.HtmlControls.HtmlTableCell PPBtn;

protected System.Web.UI.HtmlControls.HtmlTableCell NPBtn;

protected System.Data.SqlClient.SqlCommand sqlSelectCommand2;

protected System.Web.UI.HtmlControls.HtmlTableCell BtnCfmMod;

protected System.Data.SqlClient.SqlDataAdapter dadpProducts;

protected System.Data.SqlClient.SqlDataAdapter dadpProductsCount;

protected System.Data.SqlClient.SqlCommand sqlSelectCommand1;

protected System.Data.SqlClient.SqlCommand sqlInsertCommand1;

protected System.Data.SqlClient.SqlCommand sqlUpdateCommand1;

protected System.Data.SqlClient.SqlCommand sqlDeleteCommand1;

 

// 当前显示记录页

public int CurrentPage

{

get

{

if (ViewState["CurrentPage"] == null)

return 1;

else

return (int)ViewState["CurrentPage"];

}

set

{

ViewState["CurrentPage"] = value;

}

}

// 记录页大小

int PageSize = 10;

// 总记录页数

int TotalPages = 0;

// 是修改还是删除

bool IsModify = false;

 

private void Page_Load(object sender, System.EventArgs e)

{

// 取得所要进行的操作”opr

string opr = "";

if (IsPostBack) opr = Request.Form["opr"];

// 计算产品列表的总记录页数

DataTable dt = new DataTable();

dadpProductsCount.Fill(dt); // select count(*) from products

int rc = (int)dt.Rows[0][0];

TotalPages = rc/PageSize;

if (rc%PageSize != 0) TotalPages++;

// 根据 opr 执行相应的操作

switch(opr)

{

// 第一次打开页面

default:

ShowRecords(); // 显示当前页记录

break;

// “下一页

case "NextPage":

CurrentPage++; // 当前页增一

ShowRecords();

break;

// “上一页

case "PriorPage":

if (CurrentPage > 1)

CurrentPage--;

ShowRecords();

break;

// “删除

case "DeleteRecs":

ShowSelected();

break;

// 确认删除

case "ConfirmDeleteRecs":

DeleteSelected();

break;

// 修改

case "ModifyRecs":

IsModify = true;

ShowSelected();

break;

// 确认修改

case "ConfirmModifyRecs":

ModifySelected();

break;

}

}

// 显示 CurrentPage 页 记录

private void ShowRecords()

{

dsProducts1.Products.Clear();

dadpProducts.Fill(dsProducts1, (CurrentPage-1)*PageSize, PageSize, "Products");

ShowDataRows(dsProducts1.Products.Select()/*显示当前页所有记录*/);

BtnCfmDel.Visible = false;

BtnCfmMod.Visible = false;

BtnDelSel.Visible = true;

BtnModSel.Visible = true;

}

// 显示 选定记录

private void ShowDataRows(DataRow[] DataRows)

{

foreach(DataRow dr in DataRows)

{

TableRow tr = new TableRow();

ProductsList.Rows.Add(tr);

TableCell tc = new TableCell();

tr.Cells.Add(tc);

System.Web.UI.WebControls.CheckBox cb = new CheckBox();

// 用产品ID作为复选框的ID,以便 PostBack 后识别

cb.ID = "Chk_" + dr["ProductID"].ToString();

cb.Attributes.Add("onclick","CheckOut()");

tc.Controls.Add(cb);

tc = new TableCell();

tc.Text = dr["ProductName"].ToString();

tr.Cells.Add(tc);

tc = new TableCell();

tc.Text = dr["QuantityPerUnit"].ToString();

tr.Cells.Add(tc);

tc = new TableCell();

if (IsModify)// 是修改则修改规格的添加文本框

{

TextBox tb = new TextBox();

tb.ID = "UIS_"+dr["ProductID"].ToString();

tb.Text = dr["UnitsInStock"].ToString();

tc.Controls.Add(tb);

}

else        // 列表或删除则只显示规格

tc.Text = dr["UnitsInStock"].ToString();

tr.Cells.Add(tc);

}

// 通过样式来显示是否可上下翻页

PPBtn.Attributes["class"] = CurrentPage>1 ? "EnBtn":"DsBtn";

if (CurrentPage == 1) PPBtn.Attributes.Remove("onclick");

NPBtn.Attributes["class"] = CurrentPage < TotalPages ? "EnBtn":"DsBtn";

if (CurrentPage == TotalPages) NPBtn.Attributes.Remove("onclick");

}

// 显示用户选定记录,以确认删除”/“修改

private void ShowSelected()

{

DataRow[] sdr = GetSelectedRecs();

ShowDataRows(sdr);

BtnCfmDel.Visible = !IsModify;

BtnCfmMod.Visible = IsModify;

if (sdr.Length>0) BtnCfmDel.Attributes["class"] = "EnBtn";

if (sdr.Length>0) BtnCfmMod.Attributes["class"] = "EnBtn";

BtnDelSel.Visible = false;

BtnModSel.Visible = false;

}

// 取得用户选定记录

private DataRow[] GetSelectedRecs()

{

dsProducts1.Products.Clear();

dadpProducts.Fill(dsProducts1, (CurrentPage-1)*PageSize, PageSize, "Products");

string fltr = "";

// 取得用户选定记录的产品ID

// 并将所有选定的产品的 ID 生成 IN 表达式

for (int i=0; i<Request.Form.Keys.Count; i++)

{

string[] ChkID = Request.Form.Keys[i].Split(

 

个性化HTML编辑器完整版

一、上传图片

(传其他文件方法类似)

1、表单(form) encType 属性 (转到目录)

encType 属性用于指定表单数据的编码方式,常见的有两种:

(1) "application/x-www-form-urlencoded" 方式

这是一种默认方式,即键值对方式,在这种方式下,服务器脚本可通过

Request.Form["键名(表单元素的name属性)"] 获取表单元素

(2) "multipart/form-data" 方式

二进制数据方式,上传文件时要用到这种方式,例:

<form id="Form1" method="post" encType="multipart/form-data" runat="server">

<input id="ImgSrc" name="ImgSrc" type="file" runat="server">

<input type="submit" value="提交">

</form>

2、在服务器取得图片文件 (转到目录)

(1) HtmlInputFile.PostedFile 对象

获取 上传文件信息的对象。常用方法和属性:

PostedFile.FileName 属性: 上传文件的文件名

PostedFile.ContentType 属性: 上传文件的文件类型——图片、声音、电影等

PostedFile.SaveAs 方法:将上传的文件另存为

(2) 例子

private void Page_Load(object sender, System.EventArgs e)

{

if (!IsPostBack) return;

// 取得上传文件的文件名

string FileName = System.IO.Path.GetFileName(ImgSrc.PostedFile.FileName);

// 取得上传文件的类型

string[] FileType = ImgSrc.PostedFile.ContentType.ToLower().Split(new char[]{'/'});

// 若文件的类型为 "图像类"

if (FileType[0] == "image")

{

// 图片保存的路径—— Web项目下的一个文件夹。

// 必须让 ASPNET 账号有写的权限 !

string Path = "UpLoadImages/";

// 对文件更名为唯一文件名以避免文件重名

string NewFileName = System.DateTime.Now.ToString("yyyyMMddHHmmssff")+"_"+FileName;

// 保存文件

ImgSrc.PostedFile.SaveAs(Server.MapPath(Path) + NewFileName);

}

}

3、避免对话框在多窗口打开

当对话框提交表单之后,将在新窗口 打开 新的 HTML文档,为了在同一窗口打开(显示)同一对话内容,需在 head 标签内加上

<base target="_self">

二、在编辑器中插入用户上传的图片

1、打开上传文件对话框

javascript: window.showModalDialog("UpPic.aspx"/*传图片对话框窗体*/,"","center:yes;dialogHeight:200px");

2、取得上传图片文件名 (转到目录)

涉及到两个窗体之间交换信息。

window.showModalDialog 在窗口关闭时有一个返回值,其存储在 window.returnValue 中,因此,需要在上传图片之后、关闭窗口之前设置该值。

我的做法是:当成功上传图片后,

·   第一,将上传文件名存入一个 hidden 的文本框 ImgFileName 中去,以供客户端脚本取出;

·   第二,在HTML文档中插入一段取返回值 并 自动关闭窗口 javascript 脚本。

<script for=window event=onload language=javascript>

returnValue = Form1.ImgFileName.value;

window.close();

</script>

UpPic.aspx.cs

private void Page_Load(object sender, System.EventArgs e)

{

if (!IsPostBack) return;

// ...

if (FileType[0] == "image")

{

// ...

// 保存文件

ImgSrc.PostedFile.SaveAs(Server.MapPath(Path) + NewFileName);

// 给调用该Web窗体的调用者返回含Web路径 的 新文件名

ImgFileName.Value = Path + NewFileName;

// 插入客户端脚本——设置返回值和自动关闭该上传对话框

if (!IsStartupScriptRegistered("CloseDialogScript"))

RegisterStartupScript("CloseDialogScript", @"

<script for=window event=onload language=javascript>

returnValue = Form1.ImgFileName.value;

window.close();

</script>

");

}

}

3、在编辑器中插入图片 (转到目录)

执行document.execCommand("insertImage",false,"图片URL");

<td οnclick="UpPicAndGetURL()">插入图片</td>

<script language=javascript>

function UpPicAndGetURL()

{

// 打开上传对话框

var PicUrl = window.showModalDialog("UpPic.aspx","","center:yes;dialogHeight:200px");

Editor.focus();

// 若上传图片有效,则在当前插入点插入图片

if (PicUrl != null && PicUrl != "")

{

// 当前插入点插入图片

document.execCommand("insertImage","",PicUrl);

}

}

</script>

三、上传 HTML 编辑器的内容 (转到目录)

由于 form 只上传表单元素input等)的内容,用 div 作编辑器时,form 是不会将其内容上传的,因此,要想将编辑的内容上传到服务器,必须在表单提交前将编辑器的内容转存到一个表单元素上去。

1、屏蔽潜在危险检测

ASP.NET 从安全性方面考虑,默认状态下不允许上传带有 HTML 标记的内容。要上传带有 HTML 标记的内容,必须将 @Page ValidateRequest 属性设置为 false

<%@ Page ValidateRequest=false language="c#" Codebehind="HTMLEditor.aspx.cs" AutoEventWireup="false" Inherits="HKZWebExample.HTMLEditor.EditorForm" %>

2、转存 HTML到表单元素 (转到目录)

HTMLEditor.aspx

<%@ Page ValidateRequest=false language="c#" Codebehind="HTMLEditor.aspx.cs" AutoEventWireup="false" Inherits="HKZWebExample.HTMLEditor.EditorForm" %>

<script language=javascipt>

function GetHTML()

{

if (Editor.innerHTML == "" && !window.confirm("无内容,确定要提交吗?") ||

Form1.EdTitle.value == "" && !window.confirm("无标题,确定要提交吗?"))

return false;

Form1.HTMLText.value = Editor.innerHTML;

return true;

}

</script>

<form id="Form1" method="post" runat="server" οnsubmit="return GetHTML();">

<input id="HTMLText" name="HTMLText" type="hidden">

</form>

3、将HTML存入数据库 (转到目录)

HTMLEditor.aspx.cs

private void Page_Load(object sender, System.EventArgs e)

{

if (IsPostBack)

{

if (HTMLText.Value == "") return;

// HTMLText.Value 存入数据库

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值