我花了一整天的时间来寻找解决方案。我找到了一些,但没有一个对我有用。总之,我正在研究的应用程序正在从MVC3(我相信)升级到MVC5和ASP.NET版本4.6.1。其他开发人员正在进行升级,现在我必须解决他留下的所有问题和错误。我面临的问题是我无法加载强类型视图。我从主视图中调用了action方法:
<div id="fromLocationEditPartial">
@Html.Action("FormLocationEdit", "Shared", new { area = "Shared", options = Model.LocationID });
</div>
以下是我正在调用的操作方法代码:
public ActionResult FormLocationEdit(int? options)
{
LocationEditorModel model = new LocationEditorModel();
//DTLocationAutoMetadata locObj;
DTLocation locObj;
if (options.HasValue)
{
int locationID = options.Value;
//locObj = AutoMapper.Mapper.Map<DTLocation, DTLocationAutoMetadata>(entities.DTLocation.Where(m => m.LocationID == locationID).FirstOrDefault());
locObj = entities.DTLocation.Where(m => m.LocationID == locationID).FirstOrDefault();
if (locObj == null)
{
locObj = new DTLocation();
locObj.SelectLocation = new SelectList(model.GetListOfLocations(), "Value", "Text");
}
else
{
locObj.SelectLocation = new SelectList(model.GetListOfLocations(), "Value", "Text", locObj.SiteID);
}
}
else
{
locObj = null;
}
return View("~/Areas/Shared/Views/FormLocationEdit.ascx", locObj);
}
在这里你可以看到它假设返回带有对象的强类型视图。 以下是我的共享视图的样子:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CMDBv3.DTLocationAutoMetadata>" %>
<script type="text/javascript">
$(document).ready(function () {
//BindSubmitActions('formLocationEdit');
})
</script>
<% using (Html.BeginForm("FormLocationEdit", "Shared", FormMethod.Post, new { area="Shared", id = "formLocationEdit" })) {%>
***here is the condition if (Model!=null) do something else display model data***
在我的VS错误列表中,我遇到了错误:
错误4名称&#39;型号&#39;在当前上下文中不存在 错误2名称&#39; Html&#39;在当前上下文中不存在
当我运行项目时,我会遇到内部异常:
无法加载类型System.Web.Mvc.ViewUserControl&#34;&lt;&#34; CMDBv3.DTLocationAutoMetadata&#34;&gt;&#34;
据我所知,这是版本控制的一些问题,但我检查了所有的web.config,似乎版本很好。如果不是web.config问题,有人可以给我一些建议吗?
答案 0 :(得分:0)
我在过去使用区域内的ASCX共享用户控件将MVC 3(或4)项目升级到MVC 5并且默认启用了Razor视图(缺少ViewUserControl
名称空间)时,我遇到了类似的问题,因此我尝试添加这些行位于该区域的Views目录内的web.config文件中,然后正常工作:
<system.web>
<pages validateRequest="false" pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
</system.web>
注意:此更改也适用于其他区域视图&#39; web.config包含继承System.Web.Mvc.ViewPage
/ System.Web.Mvc.ViewUserControl
的ASPX页面/ ASCX控件。
然后,在该区域视图的web.config中,确保在system.web.webPages.razor
元素之间添加这些行:
<system.web.webPages.razor>
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
解决&#34;模型不存在&#34;问题,您可以在项目的web.config中更改此行:
<add key="webpages:Version" value="1.0.0.0" />
到这一行:
<add key="webpages:Version" value="3.0.0.0" />
有关升级到MVC 5的更多信息,请查看MVC 5 Upgrade Guide。
PS:当Views
目录(包括区域视图)中的web.config文件未包含或尚未创建时,通常会发生缺少的命名空间问题。此外,如果您仍然不确定尝试在与Copy Local = True
命名空间相关的参考属性中设置System.Web.Mvc
。毕竟,似乎更容易创建一个新的预定义MVC 5项目并将相关的现有资源解析为该项目。
相关问题:
Could not load type 'System.Web.Mvc.ViewUserControl<SOMETYPE>'
"The name 'HTML' does not exist in the current context" in MVC 3 Views
Razor View throwing "The name 'model' does not exist in the current context"
答案 1 :(得分:0)
我解决它的方式只是简单地创建了cshtml视图并使用了razor语法:
@model CMDBv3.DTLocation
@using (Html.BeginForm("FormLocationEdit", "Shared", FormMethod.Post, new {
area = "Shared", id = "formLocationEdit" }))
这对我有用。