繁体   English   中英

Asp.Net MVC布局和部分视图

[英]Asp.Net MVC layout and partial views

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

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

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

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

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

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

所以这里是问题:

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

非常感谢,TB。

使用一个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; }
}

所以我们这里有一个非常简单的局部视图,即'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>

渲染局部视图时,可以向其发送模型:

@Html.RenderPartial(MVC.Partials.Views.Sidebar, Model.SideBarModel);

因此,您可以将数据作为父模型的一部分发送,该模型是部分侧边栏的模型。

在部分视图中,模型属于dynamic类型,因此您无需知道它们的类型。 但是,您只需确保模型具有您需要的属性。 换句话说,你可以使用Model.MyPropertyModel.MyProperty作为MyPropertyType使用时Html.Partial

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM