2014-01-30 42 views
0

我试图在使用Razor的View页面中实现这个算法,但是它没有显示预期的结果,也没有得到任何编译错误。有什么建议吗? 编辑:我道歉我不是很清楚,我承认。我的问题是,我不明白为什么ViewBag.NbrePages等于0.但是,数据库已填充。如何有效地使用剃刀

Action();

[HttpGet] 
     public ActionResult Rechercher(string rech, string type, int num = 1) 
     { 
      int nbLignesDepassees = 10 * (num - 1); 

      ViewBag.Recherche = Server.HtmlEncode(rech); 
      ViewBag.Type = Server.HtmlEncode(type); 
      ViewBag.NumPgeCourrante = num; 

      if (type == "nomAppMetier") 
      { 
       var appsMetiers = _db.AppsMetiers 
               .Where(x => SqlFunctions.PatIndex("%" + rech + "%", x.nomApplication) > 0) 
               .OrderBy(x => x.nomApplication) 
               .Skip(nbLignesDepassees) 
               .Take(10); 
       ViewBag.NbrePages = (int)(appsMetiers.Count()/10) ; 
       return View("RechercheAppsMetiers",appsMetiers); 

      } 

      if (type == "nomPoste") 
      { 
       var postes = _db.Postes 
             .Where(x => SqlFunctions.PatIndex("%" + rech + "%", x.nomPoste) > 0) 
             .OrderBy(x => x.nomPoste) 
             .Skip(nbLignesDepassees) 
             .Take(10); 
       ViewBag.NbrePages = (int)(postes.Count()/10); 
       return View("RecherchePostes", postes); 
      } 

      return HttpNotFound(); 
     } 

查看();

<ul> 
@{ 
     for (int i = 0; i < ViewBag.NbrePages; i++) 
     { 
      if(i==1 || i==2 || i==3){ 
       <li class="disabled"><a href="#">&maquo;</a></li> 
      }else{ 
       <li><a href="#">&laquo;</a></li> 
      } 

      if (i == ViewBag.NumPgeCourrante) 
      { 
       <li class="active"><a href="#">@i <span class="sr-only">(current)</span></a></li> 
      } 
      else 
      { 
       <li><a href="#">@i </a></li> 
      } 

      if(i==ViewBag.NbrePages || i==ViewBag.NbrePages-1 || i==ViewBag.NbrePages-2){ 
       <li class="disabled"><a href="#">&raquo;</a></li> 
      }else{ 
       <li><a href="#">&raquo;</a></li> 
      } 
     } 
} 
</ul> 

非常感谢!

+1

你期待什么结果,并显示什么?此外,在这个视图中还有很多逻辑。通常这应该放在控制器中,以便创建一个模型,并将其传递给强类型视图。这使得代码更容易理解。 –

+0

没有显示,我期望显示一个Integer元素列表。哇,那么有什么建议如何使这个代码工作进行调用控制器+视图,而不是只有一个视图? – user3212730

+1

如果没有显示,可能是'ViewBag.NbrePges'为零。在这种情况下'

    '会被渲染。 –

    回答

    0

    NbrePages将是0或1(如果你有更多的是10条),由于Take(10)和使用整数除法:

    ViewBag.NbrePages = (int)(appsMetiers.Count()/10) ; 
    

    所以,最有可能你在appsMetiers少于10项。

    使用好名字或强类型的模型将有助于避免拼写像NbrePgesfor条件在原来的职位:

    for (int i = 0; i < ViewBag.NbrePages; i++) 
    

    基于在CSHTM变量的原拼写错误

    建议,以改善源直到运行时访问CSHTML文件才被编译,所以没有编译错误。由于ViewBag允许使用任何属性,因此您也没有收到任何智能感知警告。

    代替ViewBag考虑一些强类型模型或至少把寻呼强类型对象到ViewBag:具有在这么多的逻辑

    var pageingState = (PagingState)(ViewBag.Paging); 
    for(int I = 0; i < pageingState.NumberOfPages; i++)... 
    
    +0

    我编辑了我的帖子,对不起从一开始就不明确。 – user3212730

    1

    不是:

    class PagingState 
    { 
         public int NumberOfPages { get;set;} 
         public int CurrentPage { get;set;} 
    } 
    

    并鉴于查看,请考虑以下几点:

    A model

    public class PagesModel 
    { 
        public int NumberOfPages { get; set; } 
    
        public int CurrentPage { get; set; } 
    } 
    

    在类的helper方法

    public static class Helpers 
    { 
        public static bool GetClassNames(int page, int totalPages, int currentPage) 
        { 
         var classNames = new List<string>(); 
    
         var isWithinFirstOrLastThree = page <= 2 || page >= (totalPages - 2); 
    
         if (isWithinFirstOrLastThree) 
         { 
          classNames.Add("disabled"); 
         } 
         if (page == currentPage) 
         { 
          classNames.Add("active"); 
         } 
    
         return string.Join(" ", classNames.ToArray()); 
        } 
    } 
    

    然后你的看法可能是那样简单

    @model PagesModel 
    
    @for (int i = 0; i < Model.NumberOfPages; i++) 
    { 
        <li class="@Helpers.GetClassNames(i, Model.NumberOfPages, Model.CurrentPage)"> 
         <a href="#">&maquo;</a> 
         @i 
        </li> 
    } 
    

    这不完全匹配你想达到什么样的,但我希望尽管如此,它仍然有帮助。

    +0

    非常感谢Richard对我的启发。但是,我不能将它传递给模型视图,因为它使用另一个AppMetierModel – user3212730

    +0

    为什么不创建更改'AppMetierModel'以包含您的视图需要的所有信息,或创建一个新的模型类,其中包含一个类型的属性'AppMetierModel'? –

    +1

    我在想那个。这将更加尊重MVC的规则,但需要更多时间来编写代码和定义依赖关系。 – user3212730