如何使用asp.net在服务器上生成一个新的html页面?

如何使用asp.net在服务器上生成一个新的html页面?

问题描述:

我想这样做,通过按主页上的按钮,用户将能够在网站的服务器上创建一个新的HTML页面(例如www.example.com/0002.html)我需要此页面永远在那里,每个人都可以访问。如何使用asp.net编程创建一个html页面?如何使用asp.net在服务器上生成一个新的html页面?

只需创建一个新文件并将其保存在某个可通过.html文件扩展名公开访问的位置。下面是another SO question一个简短的脚本:

using (StreamWriter w = new StreamWriter(Server.MapPath("~/page.html"), true)) 
{ 
    w.WriteLine("<html><body>Hello dere!</body></html>"); // Write the text 
} 
+0

嗨,谢谢你的回答。我想先创建0001.html,然后再创建0002.html等。跟踪创建的最新页码以始终创建独特页面的最佳方式是什么?我可以在哪里存储价值? – JoeWinrow 2011-03-30 11:18:58

要在服务器上创建一个文件,你的服务器端代码需要使用一个FileStream写入磁盘,就像你会写入磁盘在正常的桌面应用。你需要做的一件事就是把它写在持有你的网站的目录中。

一些代码写入文件:

using (StreamWriter sw = new StreamWriter(Server.MapPath("fileName.html"))) 
    using (HtmlTextWriter writer = new HtmlTextWriter(sw)) 
    { 
     writer.RenderBeginTag(HtmlTextWriterTag.Html); 

     writer.RenderBeginTag(HtmlTextWriterTag.Head); 
     writer.Write("Head Contents"); 
     writer.RenderEndTag(); 

     writer.RenderBeginTag(HtmlTextWriterTag.Body); 
     writer.Write("Body Contents"); 
     writer.RenderEndTag(); 

     writer.RenderEndTag(); 
    } 
+0

谢谢!这是我第一次在这里问一个问题。你们真棒。 – JoeWinrow 2011-03-30 10:59:43

+0

嗨,谢谢你的回答。我想先创建0001.html,然后再创建0002.html等。跟踪创建的最新页码以始终创建独特页面的最佳方式是什么?我可以在哪里存储价值? – JoeWinrow 2011-03-30 11:18:39

protected void Button1_Click(object sender, EventArgs e) 
{ 
    string body = "<html><body>Web page</body></html>"; 

    //number of current file 
    int filenumber = 1; 
    string numberFilePath = "/number.txt"; 
    //change number if some html was already saved and number.txt was created 
    if (File.Exists(Server.MapPath(numberFilePath))) 
    { 
     //open file with saved number 
     using (StreamReader sr = new StreamReader(numberFilePath)) 
     { 
      filenumber = int.Parse(sr.ReadLine()) + 1; 
     } 
    } 
    using (StreamWriter sw = new StreamWriter(Server.MapPath(filenumber.ToString("D4") + ".html"))) 
    { 
     sw.Write(body); 
     //write last saved html number to file 
     using (StreamWriter numberWriter = new StreamWriter(Server.MapPath(numberFilePath), false)) 
     { 
      numberWriter.Write(filenumber); 
     } 
    } 
} 

这是我能想到的simpliest方式。我没有测试它,但它应该工作。无论如何,最好使用数据库来处理这类事情。我没有添加任何try-catch代码来保持代码简单...

+0

您应该将您的StreamWriter封装在Using语句中,以确保它正确处置。 – 2011-03-30 10:53:05

+0

你说得对。更正了,谢谢! – Episodex 2011-03-30 11:01:10

+0

嗨,谢谢你的回答。我想先创建0001.html,然后再创建0002.html等。跟踪创建的最新页码以始终创建独特页面的最佳方式是什么?我可以在哪里存储价值? – JoeWinrow 2011-03-30 11:18:21

在最基本的情况下,您可以使用流编写器在其中创建一个带有HTML标记的新文本文件。

var filePath = ""; // What ever you want your path to be 

var contentOfPage = "<html>Whatever you are writing</html>"; 

using (StreamWriter writer = new StreamWriter(Server.MapPath(filePath)) 
{ 
    writer.WriteLine(contentOfPage); 
} 

重要的是你如何决定文件名是什么?如果你没有为此添加机制,那么你每次都会覆盖同一个文件!

现在你可以使用内置的.Net方法,它非常难看,但它工作,我想。

fileName = System.IO.Path.GetRandomFileName(); 

// You may want to put an html on the end in your case 
fileName = System.IO.Path.GetRandomFileName() + ".html"; 

在这里,我很可能实现一个定制的方式,如果我做到了,搜索引擎优化的目的,但如果这并不重要

根据您的意见,你需要的是这样的代码在按钮单击事件代码:

//get all HTML files in current directory that has numeric name: 
string strRootPath = Server.MapPath("."); 
List<string> arrExistingFiles = Directory.GetFiles(strRootPath, "*.html").ToList().FindAll(fName => 
{ 
    int dummy; 
    return Int32.TryParse(Path.GetFileNameWithoutExtension(fName), out dummy); 
}); 

//calculate next number based on the maximum file name, plus 1: 
int nextFileNumber = arrExistingFiles.ConvertAll(fName => Int32.Parse(Path.GetFileNameWithoutExtension(fName))).Max() + 1; 

//generate file name with leading zeros and .html extension: 
string strNewFileName = nextFileNumber.ToString().PadLeft(5, '0') + ".html"; 
string strNewFilePath = Server.MapPath(strNewFileName); 

//write contents: 
File.WriteAllText(strNewFilePath, body); 

//let user option to see the file: 
litCreateFileResult.Text = string.Format("File created successfully. <a href=\"{0}\" target=\"_blank\">View</a>", strNewFileName); 

的代码是相当多的评论,唯一值得加入的是最后一行,这个工作添加到您的.aspx形式:

<asp:Literal ID="litCreateFileResult" runat="server" />