2012-05-08 64 views
9

Tengo dos funciones y me aparece un problema interesante. Básicamente, mi objetivo es hacer que mi código sea más portátil en un archivo cs fácil de incluir.Se necesita una referencia de objeto para el campo, método o propiedad no estático 'System.Web.UI.Page.Server.get'

Aquí está dicho archivo 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(); 
    } 
} 
} 

Esta es la página que se está refiriendo a que:

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

El error que estoy recibiendo es la que aparece más arriba, a saber:

Mensaje de error del compilador: CS0120: Se requiere una referencia de objeto para el campo, método o propiedad no estático 'System.Web.UI.Page.Server.get'

En la línea siguiente:

Línea 5: cadena de ruta = Server.MapPath ("./" + filename);

+2

Recomiendo encarecidamente que no repita los errores de php. En su lugar, busque cómo funcionan las páginas maestras o simplemente muévase a MVC. – NotMe

+1

No todos vemos el estilo de codificación de PHP como errores. Para aquellos de nosotros con un fondo de codificación más tradicional que nos brinda más controles de bajo nivel y flexibilidad de codificación a expensas de la velocidad de producción (aunque no del tiempo de ejecución) o de un gran foco de objetos, realmente se siente un poco más en casa. Además, la documentación es mejor = P. Además, me parece que cuanto más profundo se adentra en el agujero de conejo de ASP.NET, peor es el resultado de su HTML y JavaScript (ya que comienza a generar mucho). XHTML, JSLint, etc. es importante para mí, por lo que prefiero mantener la mayor cantidad de código posible para mí. –

+1

Supongo que no hay nada de malo con la forma oficial de sanción de Microsoft. Sin embargo, decir que es intrínsecamente mejor porque es lo que la gente te dice que hagas es un poco falso ya que a menudo crea código con una huella de memoria más grande, más lugares para agujeros de seguridad de error común y muchas, muchas más líneas de código. Por supuesto, por otro lado, también es mejor en muchos sentidos para grandes lugares de trabajo de producción con muchos programadores individuales trabajando juntos. Diferentes estilos de codificación, eso es todo. Sin embargo, siempre estaré en el campamento de PHP, me temo. –

Respuesta

9

Server está disponible sólo a los casos de System.Web.UI.Page -implementations (ya que es una propiedad de instancia).

tiene 2 opciones:

  1. Convertir el método de estática a instancia
  2. Uso siguiente código:

(sobrecarga de crear un 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; 
} 

o (no probado):

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

o (no es tan buena opción, ya que de alguna manera finge ser estática, sino más bien es estática para webcontext-llamadas solamente):

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

El OP * está * subclasando 'System.Web.UI.Page'. Este no es el problema del OP. –

+0

** que ** es el problema del OP: ¡no puede diferenciar entre propiedades estáticas y de instancia! ... He indicado claramente 'instancia de ... ' –

+0

Claro, su respuesta es ahora más clara. Su respuesta inicial implicaba que OP no estaba usando esa clase. –

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


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

me encontré con una cosa similar hace algún tiempo - en pocas palabras no se puede tirar Server.MapPath() de las Cs de código subyacente dentro de un método estático (a menos que el código detrás de alguna manera hereda una clase de página web, que probablemente no esté permitida de todos modos).

Mi solución simple era tener el código detrás del método para capturar la ruta como argumento, luego la página web llamante ejecuta el método con Server.MapPath durante la llamada.

Código Atrás (.CS):


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

... now go do something ... 
} 

página web (.ASPX) Método de llamada:


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

No hay necesidad de golpear o hablar a la OP, parecía una confusión legítima. Espero que esto ayude ...

+0

¡De lejos el más fácil! Puedes poner todo tipo de cosas confidenciales en la CS, pasar el comando mappath no revelará ninguna información secreta. – Dandymon

Cuestiones relacionadas