【问题标题】:Mixed MVC4 into existing ASP.NET Webforms project and now strongly typed views don't recognize the type of the model将 MVC4 混合到现有的 ASP.NET Webforms 项目中,现在强类型视图无法识别模型的类型
【发布时间】:2013-09-11 15:28:53
【问题描述】:

我正在尝试将 MVC4 功能添加到现有的网络表单项目中。我已按照这些文章中概述的步骤进行操作:

http://blogs.ibs.com/Scott.Zischerk/Lists/Posts/Post.aspx?ID=20

http://www.packtpub.com/article/mixing-aspnet-webforms-and-aspnet-mvc

http://www.hanselman.com/blog/IntegratingASPNETMVC3IntoExistingUpgradedASPNET4WebFormsApplications.aspx

我的场景与提供的所有示例之间的主要区别在于,我并没有试图让它与 Razor 一起使用。我很高兴我的观点是老式的 Aspx。

到目前为止,路由方面工作得很好,正确的控制器被命中并按预期运行。我可以成功地将东西放入 ViewData 并在适当的视图上使用它。直到对视图进行强输入为止的所有操作都很顺利。

当我尝试创建强类型视图时,出现以下错误消息:

" 'object' 不包含 'someProperty' 的定义..."

这是一个无法按预期工作的测试视图示例:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MVC.Master" Inherits="System.Web.Mvc.ViewPage<TDS.Domain.Entities.SomeEntity>"  %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">

<h2> <%= Model.someProperty%></h2>
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>

我被难住了,因为我相信我已经按照所有方向让 MVC4 与现有的 Webforms 项目配合得很好。其他一切 MVC-y 都按预期工作。我无法弄清楚的一件事是将“继承”页面属性与适当的模型绑定器链接起来?这是我对可能缺少什么的最佳猜测。

编辑: 无法解决这个问题,但这是我暂时想出的 hacky 解决方法。而不是像这样将模型返回到视图:

return View(retVal);

我已经像这样将它塞进 ViewBag 中:

ViewBag.Model = retVal;

然后像这样在视图的最顶部访问它:

<% var Model = (WhateverType)ViewBag.Model; %>

超级 hacky,但实现了相同的目标。 :(

第二次编辑:

这里是 webconfig 中所要求的部分。

<runtime>
<assemblyBinding>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

控制器代码:

        SomeEntity retVal = new SomeEntity();
        using (TDS.Domain.TdsDatabase tds = new TDS.Domain.TdsDatabase())
        {
            retVal = tds.SomeEntitys.First(x => x.Id == 36);
        }
        return View(retVal);

【问题讨论】:

  • 可能很奇怪,但我也遇到了同样的问题,marging MVC 和 WebForms 项目和解决方案只是重新启动 VisualStudio。之后它开始工作。
  • 这可能是解决方案,也可以使用 Razor 页面附加到我
  • 您演示的视图不是 Razor View Engine 语法,它是 WebForms View Engine
  • 您需要为您给出示例的视图提供控制器代码。还提供来自 web config runtime->assemblybinding->dependentassembly-> 所有 assemblyIdentity 和 bindingredirect 节点的以下值。
  • 正如我的 OP 中所写:“我的方案与提供的所有示例之间的主要区别在于,我并没有试图让它与 Razor 一起使用。我为我的观点是老式的 Aspx。”

标签: c# asp.net asp.net-mvc-4 webforms


【解决方案1】:

您可能在 web.config 中缺少一些关键的 MVC 程序集:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

【讨论】:

  • 我从另一个 MVC4 解决方案中复制了这些内容,并且成功了! System.Web.WebPages.Razor、System.Web.WebPages.Deployment、System.Web.Razor
  • 最后的评论,我发现这违反直觉,因为我没有尝试在这个项目的任何地方使用 Razor,但似乎在 Web 配置中添加这些程序集解决了这个问题。
  • 这种行为确实很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2013-07-28
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多