2012-05-08 38 views
9

Mam dwie funkcje i pojawia się ciekawy problem. Zasadniczo zamierzam uczynić mój kod bardziej przenośnym w łatwym do dołączenia pliku cs.Odniesienie do obiektu jest wymagane w przypadku niestatycznego pola, metody lub właściwości "System.Web.UI.Page.Server.get"

Tutaj Mówi plik 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(); 
    } 
} 
} 

Oto strona, która jest odwołanie go:

<% @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> 

Błąd Dostaję jedną wymienione powyżej, a mianowicie:

Komunikat o błędzie kompilatora: CS0120: Odwołanie do obiektu jest wymagane w przypadku niestatycznego pola, metody lub właściwości "System.Web.UI.Page.Server.get"

Na następnej linii:

Linia 5: string path = Server.MapPath ("./" + filename);

+2

Gorąco zaleciłbym nie powtarzanie błędów php. Zamiast tego sprawdź, jak działają strony wzorcowe lub po prostu przejdź do MVC. – NotMe

+1

Nie wszyscy widzimy styl kodowania PHP jako błędy. Dla tych z nas, którzy mają bardziej tradycyjne tło kodowania, które zapewnia nam bardziej niskopoziomowe sterowanie i elastyczność kodowania kosztem szybkości produkcji (ale nie czasu wykonywania) lub silnego skupienia na obiekcie, to naprawdę czuje się trochę lepiej w domu. Poza tym lepsza dokumentacja = P. Ponadto, im głębiej wchodzisz w dziurę królika ASP.NET, tym gorszy jest twój HTML i JavaScript, który kończy się (gdy zaczyna być mocno generowany). XHTML, JSLint itd. Jest dla mnie ważna, więc wolę zachować jak najwięcej kodu na sobie. –

+1

Nie ma nic złego w oficjalnym, usankcjonowanym przez Microsoft sposobie, jak przypuszczam. Jednakże, mówiąc, jest to z natury lepsze, ponieważ to, co ludzie mówią, że robisz, jest trochę nieszczere, ponieważ często tworzy kod z większym zapasem pamięci, więcej miejsc dla często popełnianych luk w zabezpieczeniach i wieloma, wieloma liniami kodu. Oczywiście z drugiej strony jest to również lepsze pod wieloma względami dla dużych zakładów produkcyjnych, w których pracuje wielu indywidualnych programistów. Różne style kodowania, to wszystko. Jednak obawiam się, że zawsze będę w obozie PHP. –

Odpowiedz

9

Server jest dostępny tylko dla instancji System.Web.UI.Page -implementations (jak to jest właściwość instancji).

Masz 2 opcje:

  1. przekonwertować metodę od statycznych na przykład
  2. użyć poniższy kod:

(narzut tworząc 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; 
} 

lub (nie testowane):

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

lub (nie, że dobrym rozwiązaniem, ponieważ w jakiś sposób udaje się być statyczna, ale raczej jest statyczna tylko webcontext-rozmów):

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

OP * to * podklasy 'System.Web.UI.Page'. To nie jest problem PO. –

+0

** że ** jest problemem OP - nie jest w stanie odróżnić właściwości statycznej od instancji! ... wyraźnie stwierdziłem "wystąpienie ..." –

+0

Oczywiście, twoja odpowiedź jest teraz bardziej przejrzysta. Twoja początkowa odpowiedź sugerowała, że ​​OP nie używa tej klasy. –

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


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

wpadłem na coś podobnego jakiś czas temu - umieścić po prostu nie można wyciągnąć Server.MapPath() z .cs opóźnieniem kodu wewnątrz metodą statyczną (chyba tego kodu za czymś dziedziczy klasę stron WWW, co i tak prawdopodobnie nie jest dozwolone).

Moja prosta poprawka polegała na tym, że kod znajdujący się za metodą przechwycił ścieżkę jako argument, a wywołująca strona internetowa wykonuje metodę z Server.MapPath podczas wywołania.

Code Behind (.cs):


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

... now go do something ... 
} 

stronie internetowej (.ASPX) Sposób połączenia:


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

Nie trzeba walnąć lub zagadać do PO, wydawało się uzasadnione zamieszanie. Mam nadzieję, że to pomoże ...

+0

Zdecydowanie najłatwiej! Możesz umieścić wszelkiego rodzaju poufne rzeczy w CS, przekazując polecenie mappath nie ujawni żadnych tajnych informacji. – Dandymon

Powiązane problemy