Веб-сайт ASP.NET не может видеть файл .cs в папке App_Code
Итак, у меня есть веб-сайт ASP.NET(а не веб-приложение), которое я делаю в VS2010 с С#. Он отлично работает на моей машине, но когда я загружаю его на сайт, на котором он размещен, он не будет компилироваться, поскольку: "CS0246: имя типа или пространства имен" DataAccess "не может быть найдено (вам не хватает директивы using или ссылка на сборку?)"
Я использовал функцию веб-сайта для копирования в VS и не испытывал никаких проблем, пока не захочу поместить свой собственный класс в папку App_Code и использовать его. Я читал в других ответах об изменении свойств .cs на "Компиляция" вместо "Контент", но нет такой опции для меня в свойствах файла... только имя файла, полный путь и пользовательский инструмент. Здесь код из файла .cs:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Configuration;
/// <summary>
/// Provides access to SQL Server database.
/// </summary>
///
public class DataAccess
{
//Variables & public properties ***********************************
private string connectionString = "";
private int recordCount = -1;
/// <summary>
/// Property: gets count of records retrieved or changed
/// </summary>
public int Count
{
get
{
return recordCount;
}
}
//Class constructor is executed when object is initialized ***********
/// <summary>
/// Connection string name in web.config file is required to initialize DataAccess
/// </summary>
/// <param name="ConnectionName">Name of web.config connection string</param>
public DataAccess(string ConnectionName)
{
if (WebConfigurationManager.ConnectionStrings[ConnectionName] == null) {
throw new Exception("Cannot find connection string named '" +
ConnectionName + "' in web.config");
}
//Get connection string from web.config.
connectionString = WebConfigurationManager.ConnectionStrings[ConnectionName].ConnectionString;
}
/// <summary>
/// Executes SELECT statement and returns results in dataTable
/// </summary>
/// <param name="SQL">Select SQL statement</param>
/// <returns></returns>
public DataTable FillDataTable(string SQL)
{
SqlConnection _objConn = new SqlConnection(connectionString);
SqlDataAdapter objAdapter = new SqlDataAdapter(SQL, _objConn);
DataTable dt = new DataTable();
try {
objAdapter.Fill(dt);
}
catch (SqlException ex) {
throw new Exception("Error in SQL:" + SQL, ex);
}
catch (Exception ex) {
throw ex; //Bubbling exception up to parent class
}
finally {
_objConn.Close();
}
recordCount = dt.Rows.Count;
return dt;
}
/// <summary>
/// Executes "non-query" SQL statements (insert, update, delete)
/// </summary>
/// <param name="SQL">insert, update or delete</param>
/// <returns>Number of records affected</returns>
public int ExecuteNonQuery(string SQL)
{
SqlConnection _objConn = new SqlConnection(connectionString);
try {
_objConn.Open();
SqlCommand objCmd = new SqlCommand(SQL, _objConn);
recordCount = objCmd.ExecuteNonQuery();
}
catch (SqlException ex) {
throw new Exception("Error in SQL:" + SQL, ex);
}
catch (Exception ex) {
throw new Exception(ex.Message); //Rethrowing exception up to parent class
}
finally { _objConn.Close(); }
return recordCount;
}
public int ExecuteScalar(String SQL)
{
SqlConnection _objConn = new SqlConnection(connectionString);
int intID;
try {
_objConn.Open();
SqlCommand objCmd = new SqlCommand(SQL, _objConn);
intID = Convert.ToInt32(objCmd.ExecuteScalar());
}
catch (SqlException ex) {
throw new Exception("Error in SQL:" + SQL, ex);
}
catch (Exception ex) {
throw new Exception(ex.Message); //Rethrowing exception up to parent class
}
finally { _objConn.Close(); }
return intID;
}
}//end class
И с моей страницы:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
//Initialize dataAccess class
DataAccess myDA = new DataAccess("A05Customers");
//Populate dataTable and bind to GridView Control
string strSQL = "Select * from tblCustomers";
gvCustomers.DataSource = myDA.FillDataTable(strSQL);
gvCustomers.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>GridView</title>
</head>
<body>
<form id="form1" runat="server">
<div align="center" style="font-family: Verdana">
<h2>GridView</h2>
<hr style="color: #0000FF" width="800" />
<br />
<asp:GridView ID="gvCustomers" runat="server" BackColor="#FFFFCC" BorderColor="#336699" BorderStyle="Inset" BorderWidth="5px" CellPadding="2" CellSpacing="4" />
<br />
</div>
</form>
</body>
</html>
Спасибо за вашу помощь!
Ответы
Ответ 1
По умолчанию веб-сайты не компилируют файлы .cs. Вам нужно будет сделать несколько разных вещей.
-
Установите для каждого файла класса "компиляцию" в свойствах этого файла класса. Вы можете увидеть эту опцию, щелкнув файл класса, просмотрев свойства в окне проводника свойств и изменив раскрывающийся список "Действие" в "Компиляция".
-
Если приведенное выше не помогает, удалите класс из app_code и опустите его в корневую папку.
Ответ 2
У вас есть папка app_code, это корневая папка веб-приложения (не только папка или виртуальная папка). Кажется, что Asp.NET не видит папку app_code.
Параметры Conent и компиляции доступны только в проекте WebApplication.
Ответ 3
Я задал этот вопрос перед запуском учетной записи, иначе я отредактировал бы его.
У меня такая же ошибка после:
-
Проверка того, что у меня есть веб-сайт, а не веб-приложение, поэтому нет свойств компиляции/содержимого для файла .cs.
-
Проверка положения папки App_Code. Я попытался поставить GridView.aspx под root, а также в свою собственную папку, такую же ошибку.
\
\ App_Code
DataAccess.cs
\Данные приложения
\Вид сетки
GridView.aspx
Web.config
-
Перемещение класса из App_Code в root. Такая же ошибка.
-
Последнее, что я думал, будет работать, но не сделал. Используется функция публикации веб-сайта для загрузки предварительно скомпилированного кода. Я мог видеть, что это был файл DataAccess.dll в папке bin, и в корневом каталоге был файл PrecompiledApp.config. Такая же ошибка.
UPDATE: он решил: структура папок на сервере была похожа на локальную, но у меня было все в подпапке... App_Code и App_Data должны быть в корне сервера.
Ответ 4
Вероятно, вам необходимо скомпилировать приложение перед его развертыванием. На данный момент ASP.NET не знает о файлах .cs, которые не привязаны к файлам .aspx/.ascx. Я бы рекомендовал посмотреть проекты веб-развертывания или использовать опцию "Опубликовать" Visual Studio 2010. Скотт Гатри дает лучшее резюме, чем когда-либо здесь.