让我们考虑两个使用相同布局的 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/