3

私は ASP.NET MVC4 を学んでいます。これは Web 開発の最初の経験です。

私は状況に対処しています。私のコントローラの 1 つでIEnumerable<BaseClass>、View に a を返しています。

public class TestController : Controller
{
    public ActionResult Index()
    {
        return View(Models);
    }

    // this static method is just for demo
    static List<BaseModel> Models()
    {
        ...
    }
}

BaseModels に 6 つの具象クラスがあるとします。

public class ConcreteModel1 : BaseModel { .. }  // Must show view1
public class ConcreteModel2 : BaseModel { .. }  // Must show view2
public class ConcreteModel3 : BaseModel { .. }  // and so on..
public class ConcreteModel4 : BaseModel { .. }
public class ConcreteModel5 : BaseModel { .. }
public class ConcreteModel6 : BaseModel { .. }

データを表示したい場合、それぞれConcrenteModelに独自のView. 下の画像のとおりです。

ここに画像の説明を入力

どうすればこれを達成できますか? よくわからない場合は、お知らせください。ありがとうございます。

4

3 に答える 3

5

完全な解決策は次のとおりです。

モデル

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication1.Models
{
    public abstract class BaseModel
    {
        public string Content { get; set; }
    }

    public class ConcreteModel1 : BaseModel { }
    public class ConcreteModel2 : BaseModel { }
    public class ConcreteModel3 : BaseModel { }
}

複合ビュー

@model System.Collections.Generic.List<MvcApplication1.Models.BaseModel>
@{
    ViewBag.Title = "CompositeView";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>
    CompositeView</h2>
@foreach (var model in Model)
{
    Html.RenderPartial(string.Format("_{0}", model.GetType().Name), model);
}

具体的なビュー

_ConcreteModel1.cshtml

@model MvcApplication1.Models.ConcreteModel1

<h1>Concrete Model 1</h1>
@Model.Content

_ConcreteModel2.cshtml

@model MvcApplication1.Models.ConcreteModel2

<h1>Concrete Model 2</h1>
@Model.Content

_ConcreteModel3.cshtml

@model MvcApplication1.Models.ConcreteModel3

<h1>Concrete Model 3</h1>
@Model.Content

コントローラ

public ActionResult CompositeView()
{
    List<BaseModel> model = new List<BaseModel>();
    model.Add(new ConcreteModel1() { Content = "This is model 1." });
    model.Add(new ConcreteModel2() { Content = "This is model 2." });
    model.Add(new ConcreteModel3() { Content = "This is model 3." });

    return View(model);
}
于 2012-12-26T17:56:37.830 に答える
3

の複合ビューを作成してTestViewから、小さいビューごとに部分ビューをレンダリングできます。これを実現するには、複合ビューに渡されたモデルから小さいビューのモデルを使用できるようにする必要があります。

このようなもの: (TestView.cshtml)

@model ParentViewModel

@Html.RenderPartial("View1", Model.SubModel1)
@Html.RenderPartial("View2", Model.SubModel2)
@Html.RenderPartial("View3", Model.SubModel3)

次に、次のような個別のビューがあります: (View1.cshtml)

@model SubViewModel1

<!-- Whatever -->
于 2012-12-26T17:44:04.823 に答える
0

私は実際にIEnumerable<BaseModel>、特定のモデルをタイプ別に取得するための独自の組み込みメソッドを備えたコンテンツを持つカスタム モデルを作成します。そうすれば、部分ビューをレンダリングして、ConcreteModel適切に型付けされた特定のビューに送信できます。たぶん次のようなもの:

public class UltraModel
{
    // I recommend using an interface rather than a base class
    // to avoid potentially confusing types
    public IBaseModel Models { get; set; }

    public T getModelByType<T>()
    {
        return (T)Models.Where(x => x is T).FirstOrDefault();
    }
}

次に、グローバル ビューで次のようにパーシャルをレンダリングできます。

RenderPartial("ConcreteViewName", Model.getModelByType<ConcreteModel1>());

注: 上記は疑似コードとして扱います。適切に機能させるには、おそらく微調整が必​​要になるでしょう。

于 2012-12-26T17:53:00.543 に答える