继承多个形状 - ASP.NET MVC

时间:2009-06-18 08:31:30

标签: c# asp.net-mvc

我正在向页面返回多个形状,并且正在使用我创建的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对象。

有什么想法吗?

修改

这是我的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文件夹。

更新

我重新创建了整个项目,并从头开始构建它以进行双重检查。我正在使用Phil Haack's AreaLib,我不确定这是否有所不同。无论如何,我有一个ViewModels文件夹,其中包含一个名为ContractsControlViewData.cs的ViewData类,其中包含以下内容:

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函数声明放在partial类中,我就无法进行构建。

所以我不知道。我个人认为这是一个错误,但随后存储过程带回多个结果集并不是很好。事实上,这太可怕了。

修改

我发现唯一相关的是this link。但是,当我清除应用程序设置并将其设置为false时,我的* .designer.cs文件被删除,这意味着我的dbml文件中没有类可以访问。

**编辑编辑**

重新实施模型后(再次)并按照Ian的想法添加以下内容:

<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在视图中不可用,因为inherits语句中使用的泛型无效,这可以解释它的一部分。

还有什么想法?

2 个答案:

答案 0 :(得分:2)

首先,您不必完全限定命名空间,以便下面的确定。

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

然后,您需要导入该命名空间,以便ViewModel可以在视图中的ViewData.Model属性上访问。

我倾向于在同一名称空间中创建我的viewmodel,然后通过将以下内容添加到我的web.config中将其导入所有视图。

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

或者,您可以按照以下步骤在页面顶部导入命名空间。

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

然后,您可以在视图中访问您的模型,如下所示。

<%= Model.Property %>

希望这有帮助。

修改

我会尝试编译你的观点,看看问题是什么。在记事本中打开项目文件并按如下方式编辑xml。

<PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

答案 1 :(得分:0)

今天早上我必须做类似的事情才能让intellisense工作,我必须指定完整的类型定义。

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

然后,您应该能够通过标记中模型属性的关联属性访问形状。

我希望我能正确理解这个问题,希望这会有所帮助。