我正在学习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()
{
...
}
}
现在想象一下,我们在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
。如下图所示。
我怎样才能做到这一点?如果我不是很清楚,请告诉我 感谢。
答案 0 :(得分: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);
}
@model MvcApplication1.Models.ConcreteModel1
<h1>Concrete Model 1</h1>
@Model.Content
@model MvcApplication1.Models.ConcreteModel2
<h1>Concrete Model 2</h1>
@Model.Content
@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);
}
答案 1 :(得分: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 -->
答案 2 :(得分: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>());
注意:将上述内容视为伪代码。它可能需要调整才能正常工作。