2012-05-08 52 views
9

Vì vậy, tôi có hai hàm và tôi đang gặp phải một vấn đề thú vị. Về cơ bản, tôi đang hướng đến việc làm cho mã của mình dễ dàng hơn trong một tệp cs dễ dàng bao gồm.Một tham chiếu đối tượng là bắt buộc đối với trường, phương thức hoặc thuộc tính không tĩnh 'System.Web.UI.Page.Server.get'

Dưới đây là nói tập tin cs:

namespace basicFunctions { 
public partial class phpPort : System.Web.UI.Page { 
    public static string includer(string filename) { 
     string path = Server.MapPath("./" + filename); 
     string content = System.IO.File.ReadAllText(path); 
     return content; 
    } 
    public void returnError() { 
     Response.Write("<h2>An error has occurred!</h2>"); 
     Response.Write("<p>You have followed an incorrect link. Please double check and try again.</p>"); 
     Response.Write(includer("footer.html")); 
     Response.End(); 
    } 
} 
} 

Đây là trang đó được tham khảo nó:

<% @Page Language="C#" Debug="true" Inherits="basicFunctions.phpPort" CodeFile="basicfunctions.cs" %> 
<% @Import Namespace="System.Web.Configuration" %> 

<script language="C#" runat="server"> 
void Page_Load(object sender,EventArgs e) { 
    Response.Write(includer("header.html")); 
    //irrelevant code 
    if ('stuff happens') { 
     returnError(); 
    } 
    Response.Write(includer("footer.html")); 
} 
</script> 

Các lỗi tôi nhận được là một liệt kê ở trên, cụ thể là:

Thông báo lỗi trình biên dịch: CS0120: Một tham chiếu đối tượng là bắt buộc đối với trường, phương thức hoặc thuộc tính không tĩnh 'System.Web.UI.Page.Server.get'

Trên dòng sau:

Dòng 5: string path = Server.MapPath ("./" + filename);

+2

Tôi rất muốn khuyên bạn không nên lặp lại những sai lầm của php. Thay vào đó, hãy xem các trang chính hoạt động như thế nào hoặc chỉ chuyển sang MVC. – NotMe

+1

Không phải tất cả chúng ta đều thấy phong cách mã hóa của PHP là sai lầm. Đối với những người trong chúng ta với nền mã hóa truyền thống cung cấp cho chúng ta nhiều điều khiển cấp thấp và tính linh hoạt mã hóa hơn với chi phí sản xuất (mặc dù không phải là thời gian chạy) hoặc tập trung nhiều đối tượng, nó thực sự cảm thấy một chút ở nhà. Ngoài ra, tài liệu còn tốt hơn = P. Ngoài ra, tôi tìm thấy sâu hơn bạn đi vào lỗ thỏ ASP.NET, tồi tệ hơn HTML và JavaScript của bạn có xu hướng kết thúc được (vì nó bắt đầu trở nên nặng nề tạo ra). XHTML, JSLint, vv là quan trọng đối với tôi, vì vậy tôi thích giữ nhiều mã dựa vào bản thân mình nhất có thể. –

+1

Không có gì sai với cách xử phạt chính thức của Microsoft mà tôi cho là. Tuy nhiên, để nói rằng nó vốn đã tốt hơn bởi vì đó là điều mọi người bảo bạn làm là hơi thất vọng vì nó thường tạo ra mã với dấu chân bộ nhớ lớn hơn, nhiều chỗ hơn cho các lỗ hổng bảo mật thường gặp, và nhiều, nhiều dòng mã hơn. Tất nhiên, mặt khác, nó cũng tốt hơn trong nhiều cách cho nơi làm việc sản xuất lớn với nhiều lập trình viên cá nhân làm việc cùng nhau. Các kiểu mã hóa khác nhau, đó là tất cả. Tôi sẽ luôn ở trong trại PHP, tôi sợ. –

Trả lời

9

Server chỉ khả dụng cho các trường hợp System.Web.UI.Page -thực hiện (vì đây là tài sản cá thể).

Bạn có 2 lựa chọn:

  1. Chuyển đổi phương pháp từ tĩnh để dụ
  2. Sử dụng đoạn mã sau:

(overhead của việc tạo ra một System.Web.UI.HtmlControls.HtmlGenericControl)

public static string FooMethod(string path) 
{ 
    var htmlGenericControl = new System.Web.UI.HtmlControls.HtmlGenericControl(); 
    var mappedPath = htmlGenericControl.MapPath(path); 
    return mappedPath; 
} 

hoặc (không được kiểm tra):

public static string FooMethod(string path) 
{ 
    var mappedPath = HostingEnvironment.MapPath(path); 
    return mappedPath; 
} 

hoặc (tùy chọn không phải là tốt, vì nó bằng cách nào đó hàng giả là tĩnh nhưng khá là tĩnh chỉ webcontext-cuộc gọi):

public static string FooMethod(string path) 
{ 
    var mappedPath = HttpContext.Current.Server.MapPath(path); 
    return mappedPath; 
} 
+0

OP * là * phân lớp 'System.Web.UI.Page'. Đây không phải là vấn đề của OP. –

+0

** rằng ** là vấn đề của OP - anh ta không thể khác nhau giữa thuộc tính tĩnh và cá thể! ... tôi đã tuyên bố rõ ràng 'thể hiện của ... ' –

+0

Chắc chắn, câu trả lời của bạn bây giờ rõ ràng hơn. Câu trả lời ban đầu của bạn ngụ ý rằng OP không sử dụng lớp đó. –

0
public static string includer(string filename) 
{ 
     string content = System.IO.File.ReadAllText(filename); 
     return content; 
} 


includer(Server.MapPath("./" + filename)); 
1

tôi chạy vào một điều tương tự như một số thời gian trở lại - đặt chỉ đơn giản là bạn không thể kéo Server.MapPath() từ cs code-behind bên trong một phương pháp tĩnh (trừ mã đằng sau bằng cách nào đó thừa hưởng một lớp trang web, có lẽ là không được phép anyway).

Sửa lỗi đơn giản của tôi là có mã phía sau phương thức chụp đường dẫn làm đối số, sau đó trang web gọi điện thoại thực thi phương thức với Server.MapPath trong suốt cuộc gọi.

Mã Đằng sau (cs):


public static void doStuff(string path, string desc) 
{ 
    string oldConfigPath=path+"webconfig-"+desc+"-"+".xml"; 

... now go do something ... 
} 

Web Page (.ASPX) Phương thức Gọi:


... 
doStuff(Server.MapPath("./log/"),"saveBasic"); 
... 

Không cần phải bash hoặc nói chuyện với OP, nó có vẻ là một sự nhầm lẫn hợp pháp. Hy vọng điều này sẽ giúp ...

+0

Đến nay là dễ nhất! Bạn có thể đặt tất cả các loại công cụ bảo mật trong CS, thông qua lệnh mappath sẽ không cung cấp bất kỳ thông tin bí mật nào. – Dandymon

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