Asp.Net MVC布局和部分视图

Tim*_*non 7 c# asp.net-mvc partial-views viewbag

让我们考虑两个使用相同布局的视图:

  • 包含"body"的左列(两个视图的填充方式不同)
  • 右列显示一般信息(通过模型传递)

而不是两次定义正确的部分,我想知道我是否可以创建一个PartialView直接从布局页面链接.

问题是部分视图从正在呈现的视图中隐含地继承了它们的模型.由于每个视图都有自己的模型,因此我在局部视图中最终会出现模型类型不匹配的情况.

从这里我看到两个解决方案:

  • 我可以在ViewBag中插入视图模型的公共部分.不幸的是,这意味着使用此布局的每个视图都必须实现此"约定",但在编译时没有任何内容警告开发人员...
  • 我可以使用多态来使每个视图模型继承自部分视图使用的相同基类(编辑:或接口).这将在一定程度上起作用,但只要我在同一布局中有第二个局部视图,就可能以指数方式增加复杂性.

所以这里是问题:

  • 我是否正确上述假设?
  • 你还有其他可能吗?
  • 对此有何回报?

非常感谢,TB.

mat*_*ser 7

Interface在两个模型上使用并实现它,这正是它们用于它们的那种东西.

以下是使用两个不同模型实现接口的两个不同视图的示例.这是子类型而不是ad-hoc多态.

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

所以我们这里有一个非常简单的局部视图,即'InnerPartialView':

@model TestIntegration.Models.IReusableView
<div>
    @Model.Name
</div>
Run Code Online (Sandbox Code Playgroud)

哪个用于家庭和这个示例控制器的页面:

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

主页视图:

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

关于观点:

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

<h2>About</h2>
<p>
     Put content here.
         @Html.Partial("InnerPartialView")
</p>
Run Code Online (Sandbox Code Playgroud)