Я возвращаю несколько фигур на страницу и использую класс ViewData, который я создал. Пространство имен этого класса:Наследование нескольких фигур - ASP.NET MVC
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
Я воссоздал весь проект и построил его с нуля только для двойной проверки. Я использую Phil Haack's 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>
Мои 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
Единственное, что я обнаружил, что имеет отношение было this link. Однако, когда я удаляю настройки приложения и устанавливаю его в false, мой файл * .designer.cs удаляется, что означает, что классы из моего файла dbml не доступны.
** EDIT EDIT **
После повторной реализации модели (опять же) и идти с идеей Иэна добавить следующее:
<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 не было доступно в представлении, потому что общий параметр, используемый в инструкции наследования, недействителен, что объясняет его часть.
Любые дальнейшие мысли?
Проблема для меня, в частности, заключается в том, что ViewData даже не отображается в intellisense для страницы. Он появляется только в том случае, если я избавлюсь от общего типа inbetween < and > – Kezzer
У вас есть dll System.Web.Mvc, импортированное в ваше решение? Какие пространства имен вы импортируете в свой web.config? – madcapnmckay
У меня DLL импортирована, но проверит web.config. Ура! – WestDiscGolf