无法加载类型System.Web.Mvc.ViewUserControl <somethig>

时间:2017-04-19 12:43:47

标签: c# asp.net-mvc-5

我花了一整天的时间来寻找解决方案。我找到了一些,但没有一个对我有用。总之,我正在研究的应用程序正在从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问题,有人可以给我一些建议吗?

2 个答案:

答案 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" }))

这对我有用。