MVC4 機能を既存の Web フォーム プロジェクトに追加しようとしています。これらの記事で概説されている手順に従いました。
http://blogs.ibs.com/Scott.Zischerk/Lists/Posts/Post.aspx?ID=20
http://www.packtpub.com/article/mixing-aspnet-webforms-and-aspnet-mvc
私のシナリオと提供されているすべての例の主な違いは、これを Razor で動作させようとしていないことです。私の意見が古い学校の Aspx であることを完全に嬉しく思います。
これまでのところ、ルーティングの側面は非常にうまく機能し、正しいコントローラーがヒットして期待どおりに機能します。物事を ViewData に正常に配置し、適切なビューでそれを使用できます。ビューを強く入力するまでのすべてがうまく機能します。
厳密に型指定されたビューを作成しようとすると、次のエラー メッセージが表示されて失敗します。
「「オブジェクト」には「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 は期待どおりに機能しています。私が把握できていないことの 1 つは、「継承」ページ プロパティを適切なモデル バインダーにリンクするものは何ですか? これは、何が欠けているかについての私の最善の推測です。
編集:これを解決できませんでしたが、これは私が当分の間思いついたハッキーな回避策です。次のようにモデルをビューに戻す代わりに:
return View(retVal);
次のようにViewBagに詰め込むことにしました:
ViewBag.Model = retVal;
次に、次のようにビューの最上部でアクセスします。
<% var Model = (WhateverType)ViewBag.Model; %>
非常にハックですが、同じ目標を達成します。:(
2回目の編集:
これは、要求された 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);