7

同じレイアウトを使用する2つのビューを考えてみましょう。

  • 「本体」を含む左側の列(両方のビューで異なる方法で入力されます)
  • 一般情報を表示する右側の列(モデルを介して渡される)

正しい部分を2回定義する代わりに、レイアウトページから直接リンクするPartialViewを作成できるかどうか疑問に思いました。

問題は、部分ビューが、レンダリングされているビューからモデルを暗黙的に継承することです。また、各ビューには独自のモデルがあるため、部分ビューでモデルタイプが一致しなくなります。

ここから、2つの解決策がわかります。

  • ビューモデルの共通部分をViewBagに挿入できます。残念ながら、これは、このレイアウトを使用する各ビューがこの「規則」を実装する必要があることを意味しますが、コンパイル時に開発者に警告するものは何もありません...
  • ポリモーフィズムを使用して、各ビューモデルがパーシャルビューが使用するのと同じ基本クラス(編集:またはインターフェイス)から継承するようにすることができます。これはある程度までは機能しますが、同じレイアウトで2番目の部分ビューを取得するとすぐに、複雑さが指数関数的に増加する可能性があります。

だからここに質問があります:

  • 私は上記の仮定で正しいですか?
  • 他に可能性はありますか?
  • これに関する経験の見返りはありますか?

どうもありがとう、TB。

4

3 に答える 3

7

を使用Interfaceして 2 つのモデルに実装します。これはまさに、それらが使用される種類のものです。

以下は、両方ともインターフェースを実装する 2 つの異なるモデルを使用する 2 つの異なるビューの例です。これは、アドホック ポリモーフィズムではなく、サブタイピングです。

public class ViewModelOne : IReusableView
{
    public string Name { get; set; }
    public string Something { get; set; }
    public int ANumber { get; set; }
}

public class ViewModelTwo : IReusableView
{
    public string Name { get; set; }
    public string Thing { get; set; }
    public string SomethingElse { get; set; }
    public int ANumber2 { get; set; }
}

public interface IReusableView
{
    string Name { get; }
}

ここには、'InnerPartialView' という非常に単純な部分ビューがあります。

@model TestIntegration.Models.IReusableView
<div>
    @Model.Name
</div>

この例のコントローラーのホームページと about ページで使用されているもの:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View(new ViewModelOne() { Name = "hello", Something="sdfsdfs", ANumber = 1 });
        }

        public ActionResult About()
        {
            return View(new ViewModelTwo() { Name = "hello 2", SomethingElse = "aaaddd", ANumber2 = 10, Thing="rand" });
        }
    }

ホーム ビュー:

@model TestIntegration.Models.ViewModelOne
@{
    ViewBag.Title = "Home Page";
}

<h2>@ViewBag.Message</h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
    @Html.Partial("InnerPartialView")
</p>

アバウト ビュー:

@model TestIntegration.Models.ViewModelTwo
@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
         @Html.Partial("InnerPartialView")
</p>
于 2012-06-26T11:55:59.933 に答える
3

部分ビューをレンダリングするときに、モデルを送信できます。

@Html.RenderPartial(MVC.Partials.Views.Sidebar, Model.SideBarModel);

したがって、部分サイドバーのモデルである親モデルの一部としてデータを送信できます。

于 2012-06-26T12:59:18.793 に答える
-1

部分ビューでは、モデルはタイプでdynamicあるため、モデルがどのタイプであるかを知る必要はありません。ただし、モデルに必要なプロパティがあることを確認する必要があります。つまり、 を使用する場合と同じようにModel.MyPropertyまたはを使用できます。Model.MyPropertyMyPropertyTypeHtml.Partial

于 2013-03-25T22:25:25.710 に答える