如何在ASP.NET MVC4中呈现特定模型的视图?

Dar*_*Zon 3 c# asp.net asp.net-mvc razor asp.net-mvc-4

我正在学习ASP.NET MVC4,这是我在Web开发方面的第一次经历.

我正在处理一个情况.在我的一个控制器中,我正在返回IEnumerable<BaseClass>视图.

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

    // this static method is just for demo
    static List<BaseModel> Models()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

想象一下,我们在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 { .. }
Run Code Online (Sandbox Code Playgroud)

当我想显示数据时,每个ConcrenteModel都有自己的数据View.如下图所示.

在此输入图像描述

我怎么能做到这一点?如果我不是很清楚,请告诉我,谢谢.

Mik*_*oud 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 { }
}
Run Code Online (Sandbox Code Playgroud)

复合视图

@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);
}
Run Code Online (Sandbox Code Playgroud)

具体意见

_ConcreteModel1.cshtml

@model MvcApplication1.Models.ConcreteModel1

<h1>Concrete Model 1</h1>
@Model.Content
Run Code Online (Sandbox Code Playgroud)

_ConcreteModel2.cshtml

@model MvcApplication1.Models.ConcreteModel2

<h1>Concrete Model 2</h1>
@Model.Content
Run Code Online (Sandbox Code Playgroud)

_ConcreteModel3.cshtml

@model MvcApplication1.Models.ConcreteModel3

<h1>Concrete Model 3</h1>
@Model.Content
Run Code Online (Sandbox Code Playgroud)

调节器

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);
}
Run Code Online (Sandbox Code Playgroud)