7

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

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

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

问题是局部视图隐含地从正在渲染的视图继承它们的模型。而且由于每个视图都有自己的模型,我最终会在局部视图中遇到模型类型不匹配的问题。

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

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

所以这里有问题:

  • 我对上述假设是否正确?
  • 你觉得还有其他可能吗?
  • 这方面的经验有什么回报吗?

非常感谢,结核病。

4

3 回答 3

7

在两个模型上使用Interface并实现它,这正是它们的用途。

这是一个使用两个不同模型的两个不同视图的示例,它们都实现了一个接口。这是subtypeing而不是ad-hoc polymorphism

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>

用于此示例控制器的主页和关于页面:

    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.MyPropertyor Model.MyPropertyas MyPropertyTypewhen using Html.Partial.

于 2013-03-25T22:25:25.710 回答