zoukankan      html  css  js  c++  java
  • ProMesh.Net基本使用说明!

    在Winson.Framework2.0里已集成了ProMesh.Net框架,由于ProMesh.Net里的内容比较多,我也不一一详细说明了,大家感兴趣的就自己慢慢研究,或者到这里查看官方发布的其他DEMO吧

    http://www.codeplex.com/ProMesh/Wiki/View.aspx?title=Walkthrough&referringTitle=Home

    如果还不知道ProMesh.Net为何物,请先看看这里:

    http://bbs.szblogs.com/showtopic-1548.html

    在此我只大概说一下ProMesh.Net的一些基本用法,即针对我的DEMO来进行一些说明:

    一、配置

    ProMesh.Net利用了反射,对模板进行解释,可将页面文件与后台CS文件完全分离,因此要使用ProMesh.Net,必须在web.config里先做一些配置,在我的DEMO项目里,已做好了相关的配置了,如下代码:

      <appSettings>

       
    <!--ProMesh相关设置开始-->
       
       
    <!--设置模板文件的对应后台文件的程序集-->
       
    <add key="ProMesh.ApplicationClass" value="Winson.BLL.Application,Winson.BLL"/>
       
    <!--设置模板路径-->
       
    <add key="TemplatePath" value="ProMeshDemo/templates"/>
       
    <!--设置默认的主页面名称-->
       
    <add key="DefaultLayout" value="master1"/>
       
    <!--设置默认的语言-->
       
    <add key="DefaultLanguage" value="en"/>
       
    <!--设置网站的虚拟目录,如根目录则使用 / -->
       
    <add key="VirtualDir" value="/winson.web/"/>

       
    <!--ProMesh相关设置结束-->
     
    </appSettings>



    然后在<system.web>里的

    <!--URL映射,将所有html后缀都进行处理-->
       
    <httpHandlers>
         
    <add verb="*" path="*.html" type="Winson.Utility.UrlRewriter"/>
         
    <!--ProMesh相关设置开始-->
         
    <add verb="*" path="*.ashx" type="Winson.ProMesh.PageHandler,Winson.WControls"/>
         
    <!--ProMesh相关设置结束-->
       
    </httpHandlers>

     
    <httpModules>
       
    <!--ProMesh相关设置开始-->
         
    <add name="ProMeshModule" type="Winson.ProMesh.HttpModule,Winson.WControls"/>
       
    <!--ProMesh相关设置结束-->
       
    </httpModules>



    因为我想让此框架思路更清淅,因此自己另外建立了一个BLL的项目,专门用来放置ProMesh.Net的后台代码,其中配置里的

    ProMesh.ApplicationClass即映射后台文件的程序集,在ProMeshDemo目录里的test.aspx文件就是为了测试出这个配置的具体程序集写法而用的,呵呵,与ProMesh.Net无关,大家不需理会

    二、使用

    由于我现在是将文件映射到*.ashx后缀,如果大家想改为其他的,如HTML,就修改上面的配置信息即可,不过如果是HTML,记得在IIS做相关的映射。

    大家可以先看看DEMO里的效果,直接输入你项目的地址,后缀是ashx的即可,当然这个文件名首先要在BLL项目里有对应的CS后台文件的,如以下地址

    http://localhost:1969/Winson.Web/index.ashx

    这样就会直接调用Templates目录里的index.htm模板文件了,怎样,是不是感觉比较COOL?

    整个DEMO并没有使用数据库,里面的会员资料均是以数组集合形式即时产生的,大家打开DataService.cs文件就可以知道如何产生这些数据的了

    1)逻辑语句及变量标签的使用

    在模板文件里大家会看到很多标签,这些标签有部分是系统标签,有部分是在CS文件里去定义的,这些标签运用可以非常灵活,以下将以EntityDemo.htm模板文件做以说明:

    <html>
    <body>实体读取DEMO:
    <table>
    <tr>

    <th>ID</th><th>FirstName</th><th>LastName</th><th>Address</th><th>HomePhone</th>

    </tr>
    <!--$[foreach employee in Employees]-->
    <tr><td>$[employee.EmployeesID]</td><td>$[employee.FirstName]</td>
    <td>$[employee.LastName]</td><td>$[employee.Address]</td><td>$[employee.HomePhone]</td>
    </tr>
    <!--$[endfor]-->
    </table>
    <p>There are $[employees.Count] employees</p>
    <p>$[time]</p>
    </body>
    </html>


    大家可以看到,这些标签同时支持简单的逻辑判断和循环语句,如

    <!--$[foreach employee in Employees]-->


    foreach的用法与一般的C#语句用法是一样的,这里需要说明的是Employees,这个对象是由BLL项目里原EntityDemo.cs后台文件获得,代码如下:

    ViewData["Employees"] = EmpOP.GetList();//获取Employees对象,这里将返回IList


    这里的GetList()方法即调用底层获取数据的方法,没什么好说的了,大家自己看代码即可

    同时大家可以看到,在ProMesh.Net里要将底层数据传上来,是使用了一个叫ViewData的集合,跟踪代码可以发现,这个ViewData最终是由ProMesh.Net里的Table.cs继承过来的,可以看出,最后返回上层的是一个键值对的集合

    获取了实体对象后,就可以像调用实体一样去写相应的标签了,如上面需显示一个EmployeesID,直接写

    $[employee.EmployeesID]


    即可。

    这里需要注意一点的是,如果要显示对象或者变量,就要使用  $[标签内容] 的标签,如果要使用逻辑语句,就要使用 <!--$[判断逻辑语句]--> 的标签

    2)web控件标签的使用

    ProMesh.Net同时还支持一些web控件的标签使用,请看以下editemployee.htm里的代码:

    <!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"; >
    <head>
       
    <title>Untitled Page</title>
    </head>
    <body>
    <form method="post" action="$[_SELF_]">
    <!--$[if ValidationErrors]-->
    <ul>
    <!--$[foreach error in ValidationErrors]-->
    <li style="color:red">$[error.Message]</li>
    <!--$[endfor]-->
    </ul>
    <!--$[endif]-->
    <div><label>Name:</label> $[[Name]]</div>
    <div><label>Department:</label> $[[Department::ErrorBox]]</div>
    <div><label>Salary:</label> $[[Salary::ErrorBox]]</div>
    <div><input type="submit" name="btnSave" value="Save" /></div>
    </form>
    </body>
    </html>


    以上代码执行后的效果:



    很明显,以上代码产生了2个input和一个下拉框控件,要使用控件标签,需使用 $[[标签内容]]

    那么这些标签又是如何产生的呢?请大家看相应的editemployee.cs文件,此文件里的Form类继承了WebForm,而WebForm也是ProMesh.Net的底层产生的,具体如何实现,我在此也不多说了,大家有兴趣就自己看看底层的代码吧

    以下是重要的几句代码

    [FormTextBox(Width = 25, MinLength = 4, ValidationErrorMsg = "Name is too short")]
    public string Name;

    [FormDropDown(KeyMember
    = "DepartmentID" , ValueMember = "Name")]
    public int Department;

    [FormTextBox(Width
    = 10, FormatString = "0.00")]
    public decimal? Salary;


    呵,看到了吧,对应三个控件的标签就是通过以上代码产生的了,同时还可以指定控件的默认值和校验信息等,真是做得比较COOL啦

    至于如何为下拉框控件绑定数据源呢?请看以下代码:

    /// <summary>
                
    /// 绑定数据源到下拉控件
                
    /// </summary>

                protected override void OnBind()
                
    {
                    Fields[
    "Department"].DataSource = new DataService().GetAllDepartments();
                }

                
    /// <summary>
                
    /// 在填充表单时为各控件赋值
                
    /// </summary>

                protected override void OnFill()
                
    {
                    Name 
    = _employee.Name;
                    Department 
    = _employee.DepartmentID;
                    Salary 
    = _employee.Salary;
                }

                
    /// <summary>
                
    /// 在提示表单时接收各控件的值
                
    /// </summary>

                protected override void OnPost()
                
    {
                    _employee.Name 
    = Name;
                    _employee.DepartmentID 
    = Department;
                    _employee.Salary 
    = Salary;
                }

                
    /// <summary>
                
    /// 表单验证
                
    /// </summary>
                
    /// <param name="fieldName">字段名,即控件名</param>
                
    /// <param name="fieldValue"></param>
                
    /// <returns></returns>

                protected override bool OnValidateField(string fieldName, object fieldValue)
                
    {
                    
    if (fieldName == "Salary" || fieldName == "Department")
                    
    {
                        
    if (Department == 2 && Salary != null && Salary < 30000 )
                        
    {
                            ValidationErrors.Add(
    "Nah! Impossible for an IT person to make less than 30,000 !");
                            
    return false;
                        }

                    }

                    
    return true;
                }


    通过以上代码,即可将表单完整地实现出来了!


    OK,说了这么多,现在也应该说说这个框架的一些缺点啦,呵呵。

    之前本来我是想用这个框架来做个项目的,但由于其实现形式必须是模板对应一个CS文件,因此就必须为每个模板写相应的后台文件,当时就感觉这样每个去写后台文件挺麻烦的,而更郁闷的是,使用了这个框架后,所有服务器控件都不能再使用了,包括我自己的SqlPager控件等都不能用了 ,感觉这样写起代码来会辛苦好多啊!

    不过不管怎样,如果对性能要求较高的项目,使用这个东西还是挺不错的,而且其标签功能也确实挺强大,有兴趣的朋友慢慢研究下吧,呵!


    好了,对于ProMesh.Net框架,我就先说这么多啦,由于此框架功能也比较强大,太多的细节了,我只是大概说了一下用法,具体的东西还是等大家自己慢慢去体会吧,呵呵,其实我自己也没太深入地去研究,还有很多地方也不太清楚如何使用,如果有朋友研究出来了,非常希望能在此与大家分享一下哦


    终于写完了,好久没写过这么长的东西了,写得不好,不要见怪啊!

    如有问题,欢迎到我论坛提出:
    http://bbs.szblogs.com/showforum-22.html
  • 相关阅读:
    Hanoi塔
    采药
    进制转换(大数)
    Load Balancing with NGINX 负载均衡算法
    upstream模块实现反向代理的功能
    epoll
    在nginx启动后,如果我们要操作nginx,要怎么做呢 别增加无谓的上下文切换 异步非阻塞的方式来处理请求 worker的个数为cpu的核数 红黑树
    粘性会话 session affinity sticky session requests from the same client to be passed to the same server in a group of servers
    负载均衡 4层协议 7层协议
    A Secure Cookie Protocol 安全cookie协议 配置服务器Cookie
  • 原文地址:https://www.cnblogs.com/winsonet/p/981702.html
Copyright © 2011-2022 走看看