2009-06-18 2 views
0

Я возвращаю несколько фигур на страницу и использую класс 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 не было доступно в представлении, потому что общий параметр, используемый в инструкции наследования, недействителен, что объясняет его часть.

Любые дальнейшие мысли?

ответ

0

Я должен был сделать что-то подобное этим утром, чтобы заставить intellisense работать, поскольку я должен был указать полное определение типа.

Inherits="System.Web.Mvc.ViewPage<IntranetMvcAreas.Areas.Accounts.Views.ContractsControl.ViewData.ContractsViewData>" 

После этого вы должны иметь возможность получить доступ к фигурам через связанные свойства в свойстве модели в разметке.

Надеюсь, я правильно понял вопрос и надеюсь, что это поможет.

+0

Проблема для меня, в частности, заключается в том, что ViewData даже не отображается в intellisense для страницы. Он появляется только в том случае, если я избавлюсь от общего типа inbetween < and > – Kezzer

+0

У вас есть dll System.Web.Mvc, импортированное в ваше решение? Какие пространства имен вы импортируете в свой web.config? – madcapnmckay

+0

У меня DLL импортирована, но проверит web.config. Ура! – WestDiscGolf

2

Во-первых, вам не нужно полностью квалифицировать ваше пространство имен, чтобы нижеследующее было в порядке.

Inherits="System.Web.Mvc.ViewPage<ContractsViewData>" 

Затем вам нужно будет импортировать это пространство имен для ViewModel, чтобы быть доступным на имущество ViewData.Model в представлении.

Я, как правило, создаю свои модели просмотра в одном пространстве имен, а затем импортирую их во все виды, добавив ниже в свой web.config.

<namespaces> 
    <add namespace="IntranetMvcAreas.Areas.Accounts.Views.ContractsControl.ViewData"/> 
</namespaces> 

В качестве альтернативы вы можете импортировать пространство имен в верхней части страницы следующим образом.

<%@ Import Namespace="IntranetMvcAreas.Areas.Accounts.Views.ContractsControl.ViewData"%> 

Вы можете получить доступ к своей модели в своем представлении следующим образом.

<%= Model.Property %> 

Надеюсь, это поможет.

EDIT

Я хотел бы попробовать и компилировать свои взгляды и посмотреть, что проблема есть. Откройте файл проекта в блокноте и отредактируйте xml следующим образом.

<PropertyGroup> 
    <MvcBuildViews>true</MvcBuildViews> 
</PropertyGroup> 
+0

Кроме того, должна ли моя модель ViewData находиться в папке «Представления» или в папке «Модель»? – Kezzer

+0

Я не думаю, что это имеет значение, где ваш класс ViewModel. Поскольку его импорт, как и любой другой в C#, вы можете иметь классы моделей в отдельной сборке, если хотите. Для небольших проектов я бы создал папку ViewModels, чтобы отделить их от основных классов модели, но это только я. – madcapnmckay

+0

Хорошо, единственная проблема, с которой я столкнулся сейчас, это то, что в тот момент, когда я использую как общий тип для инструкции inherits в верхней части моей страницы, я теряю использование ViewData. Он больше не появляется в intellisense с ошибкой «Имя« ViewData »не существует в текущем контексте». - поэтому я не могу ничего узнать о модели из этого. – Kezzer

Смежные вопросы