Я возвращаю несколько фигур на страницу и использую созданный мной класс ViewData. Пространство имен этого класса:
namespace IntranetMvcAreas.Areas.Accounts.Views.ContractsControl.ViewData
что я не уверен, что это правильно. На странице я попытался:
Inherits="System.Web.Mvc.ViewPage<ViewData.ContractsViewData>"
Но ViewData
даже не разрешает в intellisense, поэтому я не уверен, что делаю неправильно, но не могу получить доступ ни к одному из доступных объектов.
Я также делаю это в функции контроллера:
return View(new ContractsViewData(contracts, costCentres, userTerminals, serviceMapping, services));
, который должен предоставлять этот объект ViewData в представлении.
Есть идеи?
EDIT
Вот мой импорт пространств имен в моем web.config
<namespaces>
<add namespace="IntranetMvcAreas.Areas.Accounts.Models"/>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Linq" />
<add namespace="System.Collections.Generic" />
</namespaces>
Теперь я переместил ContractsViewData в папку Models.
UPDATE
Я заново создал весь проект и создал его с нуля, чтобы просто перепроверить. Я использую Фил Хаак AreaLib , я не уверен, если это имеет какое-либо значение. В любом случае, у меня есть папка ViewModels, которая содержит класс ViewData с именем ContractsControlViewData.cs
, который содержит следующее:
namespace Intranet.Areas.Accounts.ViewModels
{
using Intranet.Areas.Accounts.Models;
using System.Collections.Generic;
public class ContractsControlViewData
{
public IEnumerable<Contract> Contracts { get; set; }
public IEnumerable<tblCC_Contract_CC> tblCC_Contract_CCs { get; set; }
public IEnumerable<tblCC_Contract_Data_Terminal> tblCC_Contract_Data_Terminals { get; set; }
public IEnumerable<tblCC_CDT_Data_Service> tblCC_CDT_Data_Services { get; set; }
public IEnumerable<tblCC_Data_Service> tblCC_Data_Services { get; set; }
}
}
Тогда в моем контроллере у меня есть следующее:
public ActionResult DataContracts()
{
IEnumerable<Contract> contracts;
using(ContractsControlDataContext db = new ContractsControlDataContext())
{
IMultipleResults results = db.procCC_Contract_Select(null, null, null, null, null, null);
contracts = results.GetResult<Contract>();
}
return View(new ContractsControlViewData {
Contracts = contracts,
tblCC_Contract_CCs = null,
tblCC_Contract_Data_Terminals = null,
tblCC_CDT_Data_Services = null,
tblCC_Data_Services = null
});
}
Мой веб-конфиг имеет следующее:
<namespaces>
<add namespace="Intranet.Areas.Accounts.ViewModels"/>
<add namespace="System.Web.Mvc"/>
<add namespace="System.Web.Mvc.Ajax"/>
<add namespace="System.Web.Mvc.Html"/>
<add namespace="System.Web.Routing"/>
<add namespace="System.Linq"/>
<add namespace="System.Collections.Generic"/>
</namespaces>
My ContractsControl.design.cs
имеет следующее (потому что это не сработает, если вы поместите его в частичный класс:
[Function(Name = "dbo.procCC_Contract_Select")]
[ResultType(typeof(Contract))]
[ResultType(typeof(tblCC_Contract_CC))]
[ResultType(typeof(tblCC_Contract_Data_Terminal))]
[ResultType(typeof(tblCC_CDT_Data_Service))]
[ResultType(typeof(tblCC_Data_Service))]
public IMultipleResults procCC_Contract_Select(
[Parameter(Name = "ContractID", DbType = "Int")] System.Nullable<int> contractID,
[Parameter(Name = "ContractTypeID", DbType = "Int")] System.Nullable<int> contractTypeID,
[Parameter(Name = "ResponsibilityKey", DbType = "Int")] System.Nullable<int> responsibilityKey,
[Parameter(Name = "ExpenseType", DbType = "Char(4)")] string expenseType,
[Parameter(Name = "SupplierID", DbType = "Int")] System.Nullable<int> supplierID,
[Parameter(Name = "BusinessID", DbType = "Char(4)")] string businessID)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), contractID, contractTypeID, responsibilityKey, expenseType, supplierID, businessID);
return (IMultipleResults)result.ReturnValue;
}
Как только я поместил универсальный элемент в свой оператор Inherits, я больше не получаю доступ к ViewData. Кроме того, если я помещаю объявление функции sproc в частичный класс, я не могу выполнить сборку.
Так что я понятия не имею. Лично я думаю, что это ошибка, но тогда наличие хранимой процедуры, возвращающей несколько наборов результатов, не совсем хорошо. На самом деле, это ужасно.
EDIT
Единственное, что я нашел актуальным, было эта ссылка . Однако, когда я очищаю Настройки приложения и устанавливаю значение false, мой файл * .designer.cs удаляется, что означает, что классы из моего файла dbml недоступны.
** РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ **
После повторной реализации модели (снова) и реализации идеи Яна добавить следующее:
<PropertyGroup>
<MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>
Теперь я получаю следующую ошибку:
Error 1 Could not load type 'System.Web.Mvc.ViewPage<ContractsControlViewData>'. D:\temp\Areas\Accounts\Views\ContractsControl\DataContracts.aspx 2 Intranet
Однако я попытался использовать полное имя, а также попытался поместить класс ViewData в ту же папку, что и View, а также удалить пространство имен, чтобы убедиться, что оно доступно. Это не видно по какой-то причине, но, по крайней мере, возможно, это на шаг ближе? Я предполагаю, что ViewData не был доступен в представлении, потому что обобщение, используемое в операторе наследования, было недопустимым, что объясняло бы эту часть.
Есть еще мысли?