文章内容
2017/4/14 13:14:52,作 者: 黄兵
ASP.NET MVC 分部视图有数据无法显示
最近在做一个项目的时候,分部视图有数据,但是怎么都不显示,代码如下:
Index.cshtml内容:
<div class="column_l box-shadow">
@Html.Action("_Content", "Home", new { Id = Model.Id, area = "Topics" })
</div>
Index.cshtml创建了一个子视图指向_Content,我们看一下_Content的内容:
<div class="column_l_top">
<div class="category-main1_p1">
<font class="category-first-letter">E</font>
<span>@Model.FirstProName</span>
<b>@Model.First_English</b>
<p class="category-main1_pp1"></p>
</div>
<a href="/zixun" target="_blank"><img src="@Model.First_ImgUrl" alt="@Model.FirstProName" /></a>
<div class="column_l_r">
<p class="column_p2">@Model.First_Introduction</p>
<ul class="column_l_r_ul">
<p class="column_p3">热门项目:</p>
@{
var Second = ViewData["SecondItem"] as List<SecondProject>;
if (Second != null)
{
foreach (var item in Second)
{
<li>
<a href="@Url.Action("Pro_Text", "Eyes", new { area="Topics",[email protected]})" target="_blank">@item.SecondProName</a>
</li>
}
}
}
</ul>
</div>
</div>
@{
var itemList = ViewData["SecondItem"] as List<SecondProject>;
if (itemList != null)
{
foreach (var secondItem in itemList)
{
Html.RenderAction("_DetailProject", "Home", new { Id = secondItem.Id, area = "Topics" });
}
}
}
这里先用foreach循环遍历,之后里面又创建了一个子视图_DetailProject,代码如下;<div class="column_l_all">
<div class="ssdz-box">
<a href="@Url.Action("Pro_Text", "Eyes", new { area="Topics",Id=Model.Id})">
<img src="@Model.Project_CaseCompasionImgUrl" />
<span class="left">术前</span>
<span class="right">术后</span>
</a>
</div>
<div class="ssdz-content">
<p class="column_p4">
<a href="@Url.Action("Pro_Text", "Eyes", new { area = "Topics", Id = Model.Id })" class="column_p4_a">@ViewBag.SecondName</a>
<a href="@Url.Action("Pro_Text", "Eyes", new { area = "Topics", Id = Model.Id })" class="column_p4_more"></a>
</p>
<p class="column_p5">@Html.Raw(Model.Project_Summary)</p>
<a href="/zxmr/ybzx/syp/22.html" class="zlm-wx-links" title="$v[title]">- 广州双眼皮手术哪家医院好?</a>
<a href="/zxmr/ybzx/syp/260.html" class="zlm-wx-links" title="$v[title]">- 什么脸型配什么样的双眼皮</a>
<a href="/zxmr/ybzx/syp/261.html" class="zlm-wx-links" title="$v[title]">- 割双眼皮需要多少钱</a>
</div>
</div>
代码正常,并没有什么错误,看一下后台代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | // GET: Topics/Home public ActionResult Index(int Id) { using(UnitOfWork uow=new UnitOfWork()) { var First = uow.FirstProjectRepository.Get(x => x.Id == Id); FirstProject FirstProject = new FirstProject(); FirstProject.Id = First.Id; FirstProject.FirstProName = First.FirstProName; return View(FirstProject); } } [ChildActionOnly] public ActionResult _Content(int Id) { using (UnitOfWork uow = new UnitOfWork()) { var first = uow.FirstProjectRepository.Get(x => x.Id == Id); //枚举二级目录项目 var SecondItem = uow.SecondProjectRepository.GetAll().Where(x => x.FirstProId == Id); ViewData["SecondItem"] = SecondItem.ToList(); return PartialView(first); } } [ChildActionOnly] public ActionResult _DetailProject(int Id) { using(UnitOfWork uow=new UnitOfWork()) { var second = uow.ProjectDetailsRepository.Get(x => x.Project_SecondProId == Id); ProjectDetails Detail=new ProjectDetails(); Detail.Id=second.Id; Detail.Project_CaseCompasionImgUrl = second.Project_CaseCompasionImgUrl; Detail.Project_Summary = second.Project_Summary; var first = uow.SecondProjectRepository.Get(x => x.Id == Id).SecondProName; ViewBag.SecondName = first; return PartialView(Detail); } } |
看一下_DetailProject的监视:

产生的数据也是正常的,但是就是无法显示,最后在群里面问了一下,终于找到一个人,给我调试了20多分钟,终于显示了。
修改了如下地方:
1 2 3 4 5 6 7 8 9 10 11 | @{ var itemList = ViewData["SecondItem"] as List<SecondProject>; if (itemList != null) { foreach (var secondItem in itemList) { Html.Action("_DetailProject", "Home", new { Id = secondItem.Id, area = "Topics" }); } }} |
将 Html.Action修改为Html.RenderAction:
1 2 3 4 5 6 7 8 9 10 11 | @{ var itemList = ViewData["SecondItem"] as List<SecondProject>; if (itemList != null) { foreach (var secondItem in itemList) { Html.RenderAction("_DetailProject", "Home", new { Id = secondItem.Id, area = "Topics" }); } }} |
一直搞不懂为什么这么做可以显示,我参考了这几篇文章:
部分视图调用方法总结(Action 、 RenderAction 、 Partial 、 RenderPartial)
Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法
依然没有找到正确的答案。
之后查了一下MSDN文档:
| 名称 | 说明 | |
|---|---|---|
|
Action(HtmlHelper, String) |
|
|
Action(HtmlHelper, String, Object) |
|
|
Action(HtmlHelper, String, String) |
|
|
Action(HtmlHelper, String, RouteValueDictionary) |
|
|
Action(HtmlHelper, String, String, Object) |
|
|
Action(HtmlHelper, String, String, RouteValueDictionary) |
|
|
RenderAction(HtmlHelper, String) |
|
|
RenderAction(HtmlHelper, String, Object) |
|
|
RenderAction(HtmlHelper, String, String) |
|
|
RenderAction(HtmlHelper, String, RouteValueDictionary) |
|
|
RenderAction(HtmlHelper, String, String, Object) |
|
|
RenderAction(HtmlHelper, String, String, RouteValueDictionary) |
|
一个是Html字符串方式返回结果,另外一个是内联方式呈现结果。
这个内联方式是什么很让人好奇,之后又在网上找了一下资料:
所谓的内联函数,指的说将某些较为短小的代码定义为内联函数,指示编译器在遇到该指出内联内将其代码加入编译。换句话来说,你的内联函数其实相当于在你每个调用函数中重写其中的代码而已。在对于过程化语言中,由于一些过小的函数,需要重用,所以使用内联函数节省代码编写者的编写时间。它与函数的区别就在于——可以实现一样的功能,但编译的结果是,内联是在每个调用函数中重新编译,而函数则是编译在其他的地方以供调用。事实上大多数时间我们是不需要内联的——之所谓出现内联的原因就是,函数的调整用要中断当前的调用,转入子调用中处理,然后再返回调用函数,换句话来说,每一个函数的调用过程都是需要一定的运行代价的——它在保留调用函数的值,然后执行被调函数,然后将被调函数结果送回调用函数,再恢复调用函数的运行。在汇编上的表现就是使用了call方式(JP无条件跳转指令)。而内联函数是增加了编译后的程序空间,但是程序运行时没有任何人的调用,这样能保持程序运行的性能。所以这也决定了内联函数不能写太大原因——过大的不符合代码复用的原则。
回过头来看C#,.net的运行是类库的支持下运行的。换句话来说,除了正常的语句外,很多地方都是使用类库调用,那么也就是说,他们本身已经是一种编译后的规则了,每一个类库都可以理解成内联的(他们会生成相同的MSIL,MSIL是IL的子集)。那么我们是否还有必须使用内联么?答案案是在这种情况下,内联已经没有任何优势可言。虽然你可以把类库的调用看作内联,但是其实他们已经是调用关系了——所以在C#下没有内联的任何市场,那么类似的宏声明(内联函数就是一种宏声明)也没有任何存在的价值。所以在C#下没有宏声明是十分正常的。
但是条件宏是对编译器的不同指令,这个还是十分有存在必要的。于是C#中并不是没有宏,而是只保留了条件宏,对于宏声明却是丢掉了!
现在看来,如果把整个宏体系只保留条件宏而出现在C#中,那么再叫宏似乎有点不合适了——于是在.net中称这些保留下来的条件宏为条件编译,而不再称呼其为宏编译了。其实还是一样的。
看的人一头雾水,还是等到后面再深入研究了之后再来看这段话吧!
本文已在版权印备案,如需转载请访问版权印。28669631
评论列表