1

2 つのアセンブリがあるとします。

project.web
project.lib

project.web アセンブリは、いくつかのビジネス ロジックを含む project.lib を参照します。project.lib の単純なクラス:

public class Person
{
    public string Name;
}

project.web.Controllers で:

Using project.lib.models;

public class PersonController : Controller
{
    Person person = new Person();

    public ActionResult Index()
    {
        return View(person);
    }
}

これは私がいくつか質問がある部分です。多くのサンプル プロジェクトで、ビュー (この場合は Index.aspx) で次のことを確認しました。

<% @Import Namespace="project.lib.models" %>

Model オブジェクトを次のように使用できるようにします。

<%= Model.Name %>

私はそれを例のように機能させていません。私はしなければなりませんでした:

<%= (Model as Person).Name %>

また

<%
    var person = (Person)Model;
    Response.Write(person.Name);
%>

なぜこのようになるのでしょうか。この厳しさの理由は何ですか?コメント? 提案?私のクラス定義は次のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace project.lib.models
{
    public class Person
    {
        public Int64 PersonID;
        public string DisplayName;
        public string RealName;
    }
}
4

4 に答える 4

1

ビューが強く型付けされていない可能性があります。次のことを試してください。

  1. ビュー マークアップをコピーする
  2. ビューを削除する
  3. ビューを駆動するコントローラー アクションに移動します。
  4. このメソッド内で右クリックし、[ビューの追加] オプションを選択します。
  5. これが厳密に型指定されたビューであり、目的のモデルの型を適切に識別していることを確認してください。
  6. ビュー マークアップを新しく作成したビューに貼り付けます。

これはうまくいくはずです。モデルを正しくキャストできるため、アセンブリが欠落しているようには見えません。

ビューを削除/復元する手間をかけずに上記を実行できることに注意してください。各ビューには、最初の行として次のような宣言があります。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<DomainModel.Person>" %>

理解すべき重要なセクションは、このビューが MVCViewPage<DomainModel.Person>クラスを拡張することを意味する Inherits 属性です。Model プロパティは、実行時に DomainModel.Person 型になります。

また、以前のバージョンの ASP.NET MVC には、厳密に型指定されたビューが正しく機能しないという問題があります。詳細については、ASP.NET MVC RC1 で厳密に型指定されたビューの [ビューの追加] ダイアログを使用する際の問題を参照してください。

編集:ここに投稿したすべての人による少しの調査作業の後、Visual Studio が Person クラスを含むアセンブリの古いバージョンを参照していたようです。開発環境を閉じて、すべての obj/bin フォルダーをクリアし、再起動すると、この問題が修正されたようです。

于 2009-09-12T19:43:11.827 に答える
1

更新 1: System.Web.Mvc.ViewPageまたはproject.lib.models.Personの型への読み込み/取得の問題ではないことはかなり確信で​​きることに注意してください。質問で述べたように、次を使用すると機能します。

<% @Import Namespace="project.lib.models" %>
...
<%= (Model as Person).Name %>

System.Web.Mvc.ViewPage<project.lib.models.Person>ページディレクティブで使用し、機能する<%= Model.Name %>必要があります。それがうまくいかない場合に私が試すいくつかの追加のこと:

  • その際、import ディレクティブを削除してください。
  • その名前空間が web.config に追加されているかどうかを確認してください。

上記の 2 つの方法で問題が発生することはありませんが、前述の方法で動作しない場合は、非常に奇妙なシナリオになります。また、一般的に使用される名前空間を web.config に追加した場合はViewPage<Person>、ページ ディレクティブで使用できることにも注意してください。


参照するModel.Nameは、名前空間のインポートとは関係ありません。ページ ディレクティブで設定した型から取得します。

ViewPage クラスにはプロパティ T Model があります。これが、Name プロパティにアクセスできる理由です (指定した型で作業しています)。

于 2009-09-19T08:19:22.010 に答える
0

そのためには、Person クラスの場合、ビューをモデル オブジェクトに強く型付けする必要があります。

それを機能させるために必要なのは、refrence を project.lib に追加し、ページ derictive の更新を追加することだけです。

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
于 2009-09-20T19:29:58.033 に答える