2011-02-17 152 views
0

我想知道如何在MVC框架,特别是CodeIgniter中实现像PHP功能一样的asp.net“用户控件”。MVC的“用户控件”PHP

为了更好地解释我想要什么,这里的一些指导:

  • 一个.NET用户控件是一个文件,既ASPX和代码(C#/ VB),提供跨落实每一个页面功能它(比如购物车)。它很容易添加到母版页,该母版页是该网站中每个其他页面的容器。

  • 在MVC结构中,页面由加载视图的控制器加载。我知道我可以在视图中加载视图,但是如何为“跨站点视图”提供控制器代码而不必在每个主控制器上重复它?

例子:我有一个加载从数据库分类成一个选择列表中的视图,这种观点是对每个页面的顶部。正如我不应该(我不确定是否有可能)从视图中访问我的类别模型,我可以在哪里放置代码来加载此数据,而无需在每个控制器的每个函数中重复该代码?

回答

1

如果你想避免在每个控制器中重复代码,那么简单地扩展CI_Controller类,并在实例化时执行新控制器类中的所有设置......并让所有常规控制器都继承自New_Controller

+0

感谢您的评论。我一直这样做,但似乎并不正确。我最终将得到一个巨大的New_Controller文件,来自各处的代码都混在一起,并从其他控制器类继承。似乎很笨拙。 – noinstance 2011-02-17 16:59:58

+0

@nosuchnick - 没有规则说你应该只有*一个*这样的控制器 - 你可以有一个`Base_Controller`包含一些公共代码,然后是一个`Shopping_Controller`,专门用于购物车的常用功能和数据,以及另一个`Shopping_Specials_Controller`,增加了一些专门的功能......并且所有这些都与`Admin_Controller`(它也从`Base_Controller`继承)分开 - 所以你只能加载你需要的东西。 – 2011-02-17 17:12:25

0

正如肖恩所说,如果功能是在控制器级别,你应该扩展CI_Controller。 可能某些功能应该处于视图级别,因此可以使用加载程序视图来帮助您保持每个页面的全局布局并包含常用功能。这是这样的:

[观点] layout.php中:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es"> 
<head> 
     <?php 
      $this->load->view('meta', $data); 
     ?> 
</head> 
    <body> 
     <div id="wrapper"> 

      <?php 
      $this->load->view('header', $data); 
      ?> 
      <div id="contents"> 

       <?php include ('menu_izq.php'); ?> 

       <div id="page"> 
        <?php $this->load->view($page, $data); ?> 
        <div class="clear"></div> 
       </div> 
      </div> 
      <div style="clear: both;"></div> 
      <?php $this->load->view('footer');?> 
     </div> 
    </body> 
</html> 

在你的控制器,你应该总是加载这个视图和参数数组中传递内容的真实观点的价值,就像

$data['page'] = 'incidents'; // this is the real contents 
    $stylesheets[] = '/scripts/jscalendar-1.0/skins/aqua/theme.css'; 
    $data['stylesheets'] = $stylesheets; 
    $scripts[] = '/scripts/jscalendar-1.0/calendar.js'; 
    $scripts[] = 'https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'; 
    $scripts[] = '/scripts/autoNumeric-1.4.1.js'; 
    $scripts[] = '/scripts/autoLoader.js'; 
    $data['scripts'] = $scripts; 
    $this->load->view('container',$data); 
0

我对母版页的工作量很少,主要是在Sharepoint中,但如果您想要一个front.master页来这么说,然后在该上下文中加载所有其他页面,最好的办法是创建一个新库作为视图处理程序,在语法上设计它来加载t他在主人的次要观点。

由一个简单的类:

class MasterViewTemplate 
{ 
    public $master = "v1.php"; 
    private $data = array(); 

    public function __set($key,$value) 
    { 
     $this->data[$key] = $value; 
    } 

    public function __get($key) 
    { 
     return $this->data[$key]; 
    } 

    public function setMaster($master) 
    { 
     $this->master = $master; 
    } 

    public function display($page) 
    { 
     //Load the master file 
     //Load the inner $page file 
     //Inject the page contents into the master 
    } 
} 

这是那种你一直在寻找的东西。