2009-05-12 37 views
6

Tôi đang làm việc trên một trang web (không phải ứng dụng web) trong VS 2008 .Net 3.5 và nó sử dụng mô hình .aspx duy nhất trong đó mã máy chủ được bao gồm trong phần đầu của html thay vì sử dụng mã .aspx.cs phía sau trang.Chuyển đổi một tệp aspx duy nhất thành mã sau

Tôi muốn chuyển đổi nhanh các tệp để sử dụng mô hình mã sau, nhưng cho đến nay cách duy nhất tôi có thể thực hiện việc này là xóa tệp, tạo trang aspx mới có cùng tên , sau đó sao chép thủ công mã aspx có liên quan đến trang .aspx và mã máy chủ đến trang .aspx.cs.

Có cách nào nhanh hơn để thực hiện việc này không?

Tôi đã thấy hai bài viết mà vẻ để trả lời câu hỏi này, nhưng tiếc là không: Working with Single-File Web Forms Pages in Visual Studio .NETHow do you convert an aspx or master page file to page and code behind?

Cả hai đưa ra một giải pháp đơn giản đó VS thực hiện các công việc chân, bạn chỉ trỏ nó đến một tập tin và bắn. Vì lý do gì đó, chúng không hoạt động. Bài viết đầu tiên dường như đề cập đến VS 2002 và bài viết thứ hai dường như đề cập đến một ứng dụng web.

Có hy vọng nào cho trang web không?

Ngoài ra, có thể tôi thấy điều này sai, có lợi thế nào cho mô hình trang đơn không? Tôi lên kế hoạch chuyển đổi toàn bộ trang web thành ứng dụng web sớm, mô hình trang đơn có hoạt động tốt trong các ứng dụng web không?

Trả lời

19

Nếu chuyển đổi thủ công quá tốn thời gian và chuyển đổi tự động không hoạt động, tôi cho rằng tùy chọn duy nhất khác của bạn là tạo trình chuyển đổi của riêng bạn. Bạn có thể viết một ứng dụng giao diện điều khiển đơn giản có đường dẫn thư mục trên dòng lệnh và xử lý mọi tệp trong thư mục đó. Đây không phải là quá khó - ở đây, tôi sẽ giúp bạn bắt đầu:

using System; 
using System.IO; 

class Program 
{ 
    const string ScriptStartTag = "<script language=\"CS\" runat=\"server\">"; 
    const string ScriptEndTag = "</script>"; 

    static void Main(string[] args) 
    { 
     DirectoryInfo inPath = new DirectoryInfo(args[0]); 
     DirectoryInfo outPath = new DirectoryInfo(args[0] + "\\codebehind"); 
     if (!outPath.Exists) inPath.CreateSubdirectory("codebehind"); 
     foreach (FileInfo f in inPath.GetFiles()) 
     { 
      if (f.FullName.EndsWith(".aspx")) 
      { 
       // READ SOURCE FILE 
       string fileContents; 
       using (TextReader tr = new StreamReader(f.FullName)) 
       { 
        fileContents = tr.ReadToEnd(); 
       } 
       int scriptStart = fileContents.IndexOf(ScriptStartTag); 
       int scriptEnd = fileContents.IndexOf(ScriptEndTag, scriptStart); 
       string className = f.FullName.Remove(f.FullName.Length-5).Replace("\\", "_").Replace(":", "_"); 
       // GENERATE NEW SCRIPT FILE 
       string scriptContents = fileContents.Substring(
        scriptStart + ScriptStartTag.Length, 
        scriptEnd-(scriptStart + ScriptStartTag.Length)-1); 
       scriptContents = 
        "using System;\n\n" + 
        "public partial class " + className + " : System.Web.UI.Page\n" + 
        "{\n" + 
        " " + scriptContents.Trim() + 
        "\n}"; 
       using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name + ".cs")) 
       { 
        tw.Write(scriptContents); 
        tw.Flush(); 
       } 
       // GENERATE NEW MARKUP FILE 
       fileContents = fileContents.Remove(
        scriptStart, 
        scriptEnd - scriptStart + ScriptEndTag.Length); 
       int pageTagEnd = fileContents.IndexOf("%>"); 
       fileContents = fileContents.Insert(PageTagEnd, 
        "AutoEventWireup=\"true\" CodeBehind=\"" + f.Name + ".cs\" Inherits=\"" + className + "\" "); 
       using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name)) 
       { 
        tw.Write(fileContents); 
        tw.Flush(); 
       } 
      } 
     } 
    } 
} 

30 phút mã hóa, 30 phút gỡ lỗi.Có một số lỗi rõ ràng - như, nếu mã của bạn có chứa thẻ tập lệnh đóng bất kỳ nơi nào bên trong, thì mã sẽ không được xuất chính xác. Các kết quả sẽ không được đẹp, nhưng điều này sẽ chăm sóc 90% mã của bạn, và bạn sẽ có thể để làm sạch bất kỳ kết quả vấn đề bằng tay. Ở đó, điều đó có giúp ích gì không?

+0

+1 để thực hiện thêm dặm cung cấp mẫu mã. – Armstrongest

+0

Cảm ơn bạn đã dành thời gian để cung cấp một mẫu mã tuyệt vời như vậy! –

+0

Rất đẹp! Nhưng những gì về khai báo điều khiển? Chúng thường được khai báo trên toàn cầu trong tệp được tạo ra bởi nhà thiết kế. Trong trường hợp của tôi, tôi có khoảng ~ 1000 tệp aspx cần được chuyển đổi thành mã phía sau vì vậy tôi thực sự không muốn thực hiện bất kỳ chỉnh sửa thủ công nào. – Marcus

2

Tôi không biết cách thực hiện lối tắt nào.

Đặt cược tốt nhất của bạn là tạo trang mới và sao chép dán cho đến khi mọi thứ hoạt động, sau đó xóa nguồn của bạn, đổi tên tệp mới thành tên cũ và xây dựng lại.

Không lý tưởng, nhưng có lẽ cách nhanh nhất/sạch nhất/an toàn nhất để chuyển qua.

3

Về cơ bản, bạn cần phải tạo tệp lớp. Thừa kế lớp từ System.Web.UI.Page và sau đó thay đổi chỉ thị trang của trang để trỏ tới mã phía sau.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_Default" %> 

Trường hợp Inherits là tên tệp lớp của bạn và CodeBehind là tệp mã bạn vừa tạo. Bạn có thể cần phải tải lại dự án để có được trình thám hiểm giải pháp để hiển thị tệp lồng nhau, nhưng ngay cả khi bạn không làm việc thì nó cũng hoạt động.

Bạn cũng có thể xem câu trả lời được chấp nhận để thay thế. How does IIS know if it's serving a Web Site or a Web Application project?

+0

Cảm ơn bạn đã nghĩ. Tôi vẫn đang tìm kiếm một cách đơn giản hơn vì trang web có hàng tá trang. Phương pháp của tôi, thực sự tương tự như một Serapth được đề xuất, nhưng tôi có thể thấy rằng máy của bạn cũng hoạt động tốt. Đây có thể là lựa chọn duy nhất, nhưng nếu bạn làm theo hai liên kết tôi đưa vào, bạn sẽ thấy rằng tại một thời điểm có một cách tự động ... –

+0

Nếu có hàng tá trang, tôi nghĩ điều này có thể được thực hiện chỉ trong vài giờ (các giờ khó chịu, khó chịu), hoặc nếu có hàng trăm trang, có thể viết một ứng dụng giao diện điều khiển đơn giản để phân tích các trang cho bạn bằng cách sử dụng cụm từ thông dụng và ghi vào hệ thống tệp. –

0

nếu tệp aspx của bạn có 2 phần và bạn có thể chia nó theo cách cơ học tại sao bạn không viết chỉ một trình phân tích cú pháp nhỏ để tự động hóa công việc? Không nên khó, nó chỉ là thao tác văn bản thuần túy và tìm thấy một tập tin đệ quy.

1

Cảm ơn rất nhiều! Đây là một phiên bản sửa đổi slighlty nếu mã của bạn được viết i VB.Net. Chỉ cần biên dịch và chạy trình chuyển đổi trong mỗi thư mục chứa các trang aspx.

using System.IO; 
namespace Converter 
{ 
    class Program 
    { 
     const string ScriptStartTag = "<script runat=\"server\">"; 
     const string ScriptEndTag = "</script>"; 

     static void Main(string[] args) 
     { 
      string currentDirectory = System.Environment.CurrentDirectory; 

      var inPath = new DirectoryInfo(currentDirectory); 
      var outPath = new DirectoryInfo(currentDirectory); 
      if (!outPath.Exists) inPath.CreateSubdirectory("codebehind"); 
      foreach (FileInfo f in inPath.GetFiles()) 
      { 
       if (f.FullName.EndsWith(".aspx")) 
       { 
        // READ SOURCE FILE 
        string fileContents; 
        using (TextReader tr = new StreamReader(f.FullName)) 
        { 
         fileContents = tr.ReadToEnd(); 
        } 
        int scriptStart = fileContents.IndexOf(ScriptStartTag); 
        int scriptEnd = fileContents.IndexOf(ScriptEndTag, scriptStart); 
        string className = f.FullName.Remove(f.FullName.Length - 5).Replace("\\", "_").Replace(":", "_"); 
        // GENERATE NEW SCRIPT FILE 
        string scriptContents = fileContents.Substring(
         scriptStart + ScriptStartTag.Length, 
         scriptEnd - (scriptStart + ScriptStartTag.Length) - 1); 
        scriptContents = 
         "Imports System\n\n" + 
         "Partial Public Class " + className + " \n Inherits System.Web.UI.Page\n" + 
         "\n" + 
         " " + scriptContents.Trim() + 
         "\nEnd Class\n"; 
        using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name + ".vb")) 
        { 
         tw.Write(scriptContents); 
         tw.Flush(); 
        } 
        // GENERATE NEW MARKUP FILE 
        fileContents = fileContents.Remove(
         scriptStart, 
         scriptEnd - scriptStart + ScriptEndTag.Length); 
        int pageTagEnd = fileContents.IndexOf("%>"); 

        fileContents = fileContents.Insert(pageTagEnd, 
         "AutoEventWireup=\"false\" CodeBehind=\"" + f.Name + ".vb\" Inherits=\"" + className + "\" "); 
        using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name)) 
        { 
         tw.Write(fileContents); 
         tw.Flush(); 
        } 
       } 
      } 
     } 

    } 
} 
+0

Cảm ơn sự đóng góp :) –

+0

nếu không có thẻ tập lệnh nào trong các trang? sau đó bạn chuyển đổi sẽ phá vỡ. – Smith

Các vấn đề liên quan