Наследование нескольких фигур - ASP.NET MVC - PullRequest
0 голосов
/ 18 июня 2009

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

Есть еще мысли?

Ответы [ 2 ]

2 голосов
/ 18 июня 2009

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

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 голосов
/ 18 июня 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...