文章内容

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) 调用指定子操作方法并以 HTML 字符串形式返回结果。
公共方法 静态成员 Action(HtmlHelper, String, Object) 使用指定参数调用指定子操作方法并以 HTML 字符串形式返回结果。
公共方法 静态成员 Action(HtmlHelper, String, String) 使用指定控制器名称调用指定子操作方法,并以 HTML 字符串形式返回结果。
公共方法 静态成员 Action(HtmlHelper, String, RouteValueDictionary) 使用指定参数调用指定子操作方法并以 HTML 字符串形式返回结果。
公共方法 静态成员 Action(HtmlHelper, String, String, Object) 使用指定参数和控制器名称调用指定子操作方法,并以 HTML 字符串形式返回结果。
公共方法 静态成员 Action(HtmlHelper, String, String, RouteValueDictionary) 使用指定参数和控制器名称调用指定子操作方法,并以 HTML 字符串形式返回结果。
公共方法 静态成员 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

分享到:

发表评论

评论列表