我正在向页面返回多个形状,并且正在使用我创建的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语句中使用的泛型无效,这可以解释它的一部分。
还有什么想法?
答案 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>"
然后,您应该能够通过标记中模型属性的关联属性访问形状。
我希望我能正确理解这个问题,希望这会有所帮助。