c# - Asp.Net MVC 布局和局部 View

标签 c# asp.net-mvc partial-views viewbag

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

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

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

问题在于部分 View 隐式地从正在呈现的 View 继承它们的模型。由于每个 View 都有自己的模型,我最终在局部 View 中发现模型类型不匹配。

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

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

下面是问题:

  • 我的上述假设是否正确?
  • 您认为还有其他可能性吗?
  • 在这方面有任何经验返回吗?

非常感谢, 结核病。

最佳答案

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

下面是两个不同的 View 使用两个不同的模型的例子,这两个模型都实现了一个接口(interface)。这是 subtyping而不是 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; }
}

所以我们这里有一个非常简单的分部 View ,即“InnerPartialView”:

@model TestIntegration.Models.IReusableView
<div>
    @Model.Name
</div>

在这个示例 Controller 的主页和关于页面中使用:

    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" });
        }
    }

主页 View :

@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>

关于 View :

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

<h2>About</h2>
<p>
     Put content here.
         @Html.Partial("InnerPartialView")
</p>

关于c# - Asp.Net MVC 布局和局部 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11206725/

相关文章:

jquery - 使用 AJAX/Ruby on Rails 在部分模板中定义局部变量

c# - 使用 C# 以单一形式动态创建多个文本框?

c# - 如何使用 Ruby 将时间从 .net 纪元转换为 Unix 纪元中的时间?

c# - 当线程等待到达锁定语句时记录

c# - 使用 linq-to-sql 查询加入列表

c# - 没有 ASP.NET Identity 的 OWIN cookie 身份验证

jquery - AJAX 将不带表单的 ValidateAntiForgeryToken 发布到 MVC 操作方法

asp.net-mvc - 注册新帐户时,如何要求 ASP.NET 表单例份验证以发送验证电子邮件?

asp.net-mvc - ASP.net MVC - 呈现一个包含不同类型的列表,每种类型都有不同的 View

c# - 从 foreach 循环中将模型加载到局部 View 中