ORM图sas 模板 画k线图有没有?怎么画

2763人阅读
Django(15)
一、内容概要:
二、上节回顾
三、Django 视图–views
  1、获取用户多个数据及文件上传
  2、FBV 和 CBV
  3、装饰器
四、Django模板补充
  - Django模板语言循环字典
五、Django 路由系统
  1、一对一:一个url对于一个函数或者一个类
  2.1、一对多:一类url对应一个函数或者一个类
  2.2、一对多,用法总结
  3、name参数
  4、url 路由分发机制
  5、默认值
  6、命名空间
一、内容概要:
1、路由系统——urls
4、ORM操作
select * from tb where id & 1
# 对应关系
models.tb.objects.filter(id__gt=1)
models.tb.objects.filter(id=1)
models.tb.objects.filter(id__lt=1)
二、上节回顾
1、Django请求生命周期
客户端 -& URL对应关系(匹配) -& 视图函数 -& 返回用户字符串
客户端 -& URL对应关系(匹配) -& 视图函数 -& 打开一个HTML文件,读取内容
2.1、创建django projcet
django-admin startproject mysite
- 配置文件
- settings.py
2.2创建django project app
python manage.py startapp cmdb
- views.py
- admin.py
- models.py
静态文件路径
4、编写程序
b. views.py
def func(request):
return HttpResponse('字符串')
return render(request, 'index.html', {''})
retrun redirect('URL')
c. 模板语言
return render(request, 'index.html', {'li': [11,22,33]})
{% for item in li %}
&h1&{{item}}&/h1&
{% endfor %}
***********
去索引:索引用点 **********
&h2& {{item[0] }} &/h2&
&h2& {{item.0 }} &/h2&
三、Django 视图–views
1、获取用户多个数据及文件上传
1、获取用户请求数据
request.GET
# 获取相应信息中get发送的数据
request.POST
# 获取相应信息中post发送的数据
request.FILES
# 获取相应信息中发送的文件数据
PS: # get和post都是往后台发送数据,只是get信息在网址中,post信息包含着数据内,往往:
# 获取数据
# 提交数据
2、checkbox等多选的内容
request.POST.getlist()
# get只能获取一个值,像复选框、多选下拉框时,需要用getlist获取
3、上传文件
obj = request.FILES.get('fafafa')
print( obj.name )
f = open(obj.name, mode='wb')
for item in obj.chunks():
f.write(item)
示例:用户提交数据,后台接收响应数据,并进行处理
工程名:mysite,app名:cmdb,创建接收用户上传数据目录upload
mysite/urls.py
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
cmdb/views.py
from django.shortcuts import render, redirect,HttpResponse
def login(request):
if request.method == "GET":
return render(request, 'reg.html')
elif request.method == "POST":
redio = request.POST.get("gender")
print("单选框的值:", redio)
checkbox = request.POST.getlist("favor")
print("复选框的值", checkbox)
obj = request.FILES.get("fafafa")
print(obj, type(obj), obj.name)
file_path = os.path.join('upload', obj.name)
with open (file_path, mode="wb") as f:
for i in obj.chunks():
f.write(i)
return render(request, "reg.html")
return redirect("/reg/")
templates/reg.html
action="/login/" method="POST" enctype="multipart/form-data"&
type="text" name="user" placeholder="用户名" /&
type="password" name="pwd" placeholder="密码" /&
男: type="radio"
name="gender" value="1"/&
女: type="radio" name="gender" value="2"/&
男: type="checkbox"
name="favor" value="11"/&
女: type="checkbox" name="favor" value="22"/&
name="city" multiple&
value="sh"&上海&
value="bj"&北京&
value="tj"&天津&
type="file" name="fafafa"/&
type="submit" value="提交"/&
2、FBV 和 CBV
像这种urls.py里匹配login,之后对应一个函数名。当匹配成功之后,就 执行views.py里的这个函数,函数里第一个参数封装了所有的用户请求信息。像这种叫FBV(function base view)
Django 里面还有一种:CBV(class base view)
/index/ -& 函数名
/index/ -& 类
上面都是FBV的方式,下面看看CBV写法:
url(r'^home/', views.Home.as_view()),
from django.views import View
class Home(View):
def dispatch(self, request, *args, **kwargs):
print("类似装饰器:before")
result = super(Home,self).dispatch(request, *args, **kwargs)
print("类似装饰器:after")
return result
def get(self,request):
print(request.method)
return render(request, "home.html")
def post(self,request):
print(request.method,"post方式")
return render(request, "home.html")
action="/home/" method="POST"&
type="text" name="user" /&
type="submit" /&
后续文章补充
四、Django模板补充
- Django模板语言循环字典
url(r'^index/', views.index),
USER_DICT = {
'key1':{'name':'root1','eamil':''},
'key2':{'name':'root2','eamil':''},
'key3':{'name':'root3','eamil':''},
def index(request):
return render(request, 'index.html', {'user_dict': USER_DICT})
index.html
{{ user_dict.k1 }}
for row in user_dict # 默认循环显示的是key
{% for k in user_dict.keys %}
{# 循环字典:取key值 #}
{% endfor %}
{% for val in user_dict.values %}
{# 循环字典:取value值 #}
&{{ val }}&
{% endfor %}
{% for k,row in user_dict.items %}
{# 循环字典:取key、value #}
&{{ k }}-{{ row }}&
{% endfor %}
五、Django 路由系统
1、一对一:一个url对于一个函数或者一个类
url(r'^index/', views.index),
url(r'^home/', views.Home.as_view()),
2.1、一对多:一类url对应一个函数或者一个类
如上循环字典的显示,如果是主机信息,应该显示主机名,点击才显示详细信息。实现如下:
url(r'^index/', views.index),
url(r'^detail-(key\d+).html/', views.detail),
注意:这里网址实现的方式是类似http://127.0.0.1/detail-key1.html,而不是之前的detail?nid=key1的方式。这种方式,对于网站权重来说,搜索引擎更喜欢第一种方式。权重更好,会让搜索引擎以为网页是静态的。
USER_DICT = {
'key1':{'name':'root1','eamil':''},
'key2':{'name':'root2','eamil':''},
'key3':{'name':'root3','eamil':''},
'key4':{'name':'root4','eamil':''},
'key5':{'name':'root5','eamil':''},
def index(request):
return render(request, 'index.html', {'user_dict': USER_DICT})
def detail(request, nid):
detail_info = USER_DICT[nid]
return render (request, 'detail.html', {'detail_info': detail_info})
index.html
{% for k,row in user_dict.items %}
& target="_blank" href="/detail-{{ k }}.html"&{{ row.name }}&&
{% endfor %}
detail.html
&详细信息&
&用户名:{{ detail_info.name }}&
&邮箱:{{ detail_info.email }}&
2.2、一对多,用法总结
上面的示例中,二次匹配一个值,多传一个形参匹配:
urls.py:url(r'^detail-(key\d+).html/', views.detail),
views.py:def detail(request, nid):
访问网址:127.0.0.1/detail-key1.html
如果再多匹配一个值,则如下:
urls.py:url(r'^detail-(key\d+)-(\d+).html/', views.detail),
views.py:def detail(request, nid, uid):
访问网址:127.0.0.1/detail-key1-9.html
可见:url中二次匹配的值,和形参必须一一对应,但如果位置改了,里面的代码也得跟着改
支持正则表达式 分组
urls.py:url(r'^detail-(?P&nid&\d+)-(?P&uid&\d+).html/', views.detail),
直接第一个匹配的传递给nid,第二个匹配的传递给uid,这样和views里的函数形参位置没有关系了。
views.py:def detail(request, nid, uid):
访问网址:127.0.0.1/detail-key1-9.html
分组时,个数不确定*args,**kwargs也能使用
url(r'^detail-(key\d+)-(\d+).html/', views.detail),
——& def detail(request, *args):
url(r'^detail-(?P&nid&\d+)-(?P&uid&\d+).html/', views.detail),
——& def detail(request, **kwargs):
3、name参数
如下内容:提交表单中action="/home/"需要跟着url中网址的修改而修改。
action="/home/" method="POST"&
type="text" name="user" /&
type="submit" /&
url(r'^home/', views.home),
其他web框架也是这么实现的,要改两处都需要跟着修改。这里django给提供了一个便捷的用法,name参数。
name :django 简便用法
对URL路由关系进行命名,
以后可以根据此名称生成自己想要的URL
url(r'^home/', views.home, name="homeee"),
action="{% url 'homeee' %}" method="POST"&
type="text" name="user" /&
type="submit" /&
这样写上之后,url变了,只修改urls.py那里一处就可以了。
name :匹配地址里有分组的处理
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
def index(request,nid,uid):
{% url "i2" 1 2 %}
url(r'^buy/(?P&pid&\d+)/(?P&nid&\d+)/', views.index, name='i3'),
{% url "i3" pid=1 nid=9 %}
上面是通过模板语音生成url,下面是通过reverse模块生成url,两种方式,实现功能一样。
def func(request, *args, **kwargs):
from django.urls import reverse
url1 = reverse('i1')
url2 = reverse('i2', args=(1,2,))
url3 = reverse('i3', kwargs={'pid': 1, "nid": 9})
作用:用户完成某些操作后,跳转到指定页面。
request.path_info
def index(request,nid):
print(request.path_info)
return render(request, 'index.html')
&form action="{{ request.path_info }}" method="POST"&
4、url 路由分发机制
前面的urls对应关系都在urls.py内,如果多个app,都需要在这里引入。如果app多了,任何一个app的修改都会修改这一个urls文件。
在django里面,有一个url分发的机制。
from django.conf.urls import include
urlpatterns = [
url(r'^monitor/', include("app02.urls")),
app02/urls.py
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^login/', views.login),
访问http://127.0.0.1/monitor/login,就访问的app02的login页面。
6、命名空间
后续文章补充
转载请务必保留此出处:JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的
JFinal Weixin 是基于 JFinal 的微信公众号极速开发 SDK,只需浏览 Demo 代码即可进行极速开发,自 JFinal Weixin 1.2 版本开始已添加对多公众号支持。1、WeixinConfig配置详情请见:JF
JPress,一个wordpress的java代替版本,使用JFinal开发。支持类似wordpress的几乎所有功能,比如:模板,插件等。同时在模板上,JPress提出了“模板即模型”的概念,方便模板制作人灵活制作业务模型,移除了wid
JFinal IDE是一个极速创建JFinal开发环境的Eclipse平台插件。小木学堂提供JFinal教程和支持。JFinal开发的微信小程序社区俱乐部http://www.wxappclub.com&
此项目是基于Jfianl_weixin开发的开源项目项目运行截图
模仿的Spring中的消息事件:详解Spring事件驱动模代码简单无任何第三方依赖,具体使用如下:
一、说明JFinal框架结合JFinal3.0 template、jsp、beetl、freemarker模版的js、css在线合并压缩插件!结合CDN使用效果更佳哦!二、依赖&
首创JFinal快速开发平台,降低70%开发成本。快速搞定各类管理系统,赶紧用EOVA给自己加薪吧!Eova能快速实现啥效果呐?&
朋也社区是用Java语言编写的社区(论坛)系统.
微服务分布式框架
https最关键就是比http更安全,但是https相对http访问速度较慢一些,但是拿现在的浏览器来说,比如chrome,如果不是https的,那么会一直显示不安全的提示,所以要求比较严格的网站,能用h
List&User& user = User.dao.find("select * from emp where empname='"+username+"' and emppassword = '"+userpassword
项目里面一定会有很多的action,每一个都需要验证参数的合法性,这是个很繁琐的工作,jfinal自带的拦截器功能用着还是觉得麻烦;参考hibernate-validator等现有的框架写了点东西,自我感觉美美的,特地来晒一晒(内容挺长,
jfianl怎么更新缓存
我的项目中,将用户登录信息用session保存,并将sessionId保存到用户表中。现在需要实现踢用户线下的功能。问题的关键是,如何通过这个sessionId获取到session进而销毁它?求大神指教!
JFinal-event 2.x 参(抄)考(袭)Spring 4.2.x中Event的使用方式而生,为JFinal用户带来更多方便。
今天在通过sqlite数据库生成ActiveRecord model的过程中,遇到了一个问题。简单来说,就是生成的model中,所有的属性都是String类型。于是找到了这个问题:http://www.jfinal.com/feedbac
由于 jfinal 3.3 将 JFinalConfig.configPlugin() 回调的时机提前到了 JFinalConfigRoute() 之前,所以造成 @玛雅牛 的 JFinalShiroPlugin
ActionExtHandler Handler { handle(String target, HttpServ
看了这篇文章后整合出来就报错:http://www.jfinal.com/share/-19 14:37:28.649 ER
config配置:public void configRoute(Routes me) { me.setBaseViewPath("/view");
Record model=getBean(Record.class,"data");我现在使用的是Db+Recrod 模式,没有添加过表映射,没法在getModel() 中传入对应的model.class ,jfinal有中有其他处理方式
遇到的应用场景是:数据库监控系统的开发1、系统自身的一些数据资源放在主数据库。2、其他被监控的数据库是根据用户前台的配置来动态添加的,如用户1配置了需要对A数据库进行监控,那此时需要动态的把A数据库添加进来,对其按照业务规则进行监控。能否
使用ehcache报下面这个错误:
怎么使用DruidPlugin以Windows身份登录SQLServer2008ORM工具开发系列的代码生成工具的开发,接上回,继续来设计基于模板的代码生成器。
模板编辑器 Template Editor
编辑器的基本要求是,文件编辑(Copy,Cut,Paste,Find/Replace)功能,语法高亮显示,智能提示。
对于.NET系统的内置类型,可以预先加载,并提供智能提示功能。
如图所示,可以直接引用系统内置的类型,在编辑模板时,会自动调出智能提示窗口。
如果能做到自定义的变量可达到这种效果,给模板的编写带来极大的方面,如下图所示,自定义属性Math的提示窗口
自定义的类型的解析的一个困难之处在于,它是动态增加进来的,无法预先知道它的类型定义。比如
先输入属性IncludeDelete,是简单类型,不需要智能提示支持
&%@ Property Name=&IncludeDelete& Type=&System.Int32& Default=&123& Category=&Options& Description=&If true delete statements will be generated.& %&
再写一个自定义类型MathProgram,名字是Math
&%@ Property Name=&Math& Type=&MathProgram&  Category=&Text&Description=&Namespace for this class& %&
敲完了这一句,解析器仍然无法工作,因为它不知道MathProgram类型来自于哪里,是哪一层命名空间下的。(.NET允许同一程序集,在不同的命名空间下,有相同的类型名称)。当敲完了下面的语句
&%@ Assembly Name=&TestClassLibrary& %&
&%@ Import Namespace=&EPN.Common& %&
解析器会到程序集TestClassLibrary的命名空间EPN.Common下面去找MathProgram类型,如果能找到类型定义,则把它加入到智能提示窗口中,否则不加入。
再复杂一点的情况,有两个程序集引用和两个命名空间导入,代码如下
&%@ Assembly Name=&TestClassLibrary& %&
&%@ Import Namespace=&EPN.Common& %&
&%@ Assembly Name=&TestProviderLibrary& %&
&%@ Import Namespace=&Paradox.Common& %&
有一个类型声明,代码如下所示
&%@ Property Name=&Math& Type=&MathProgram&  Category=&Text&Description=&Namespace for this class& %&
这样,需要到以上两个程序集的两个命名空间中去匹配,找到指定的类型定义则可以加入智能提示成员。情况再糟糕一点,程序集TestClassLibrary的EPN.Common命名空间下和程序集TestProviderLibrary的Paradox.Common命名空间下,都含有类型MathProgram的定义。这时应当主动报编译错误。
模板代码生成的原型
通过以下的倒退流程,由生成的代码,推回到模板定义,以解释模板代码生成的基础模型。
假设目标代码是这样的,一个简单的类型定义
public class MathProgram
   public MathProgram()
   {
   }
用简单的变量替换,可以写成这样的代码,也就是把类型名字换成字符串值
&% private string classname = “MathProgram”; %&
public class &%=classname%&
  public &%=classname%& ()
   }
如何做到变量可以替换?把上面的代码,放到一个Stream中,在执行时替换变量定义即可
string classname = “MathProgram”;
MemoryStream mStream = new MemoryStream();
StreamWriter writer = new
StreamWriter(mStream,System.Text.Encoding.UTF8);
writer.Write(@&public class );
writer.Write(classname);
writer.Write(@&{
writer.Write(classname);
writer.Write(@&()
StreamReader sr = new StreamReader(mStream);
writer.Flush();
mStream.Position = 0;
string code = sr.ReadToEnd();
最终的变量code就是我们需要的结果。
再推进一下,字符串值可以由用户来输入或是通过Properties窗体来设置,那就是像这样
&%@ Property Name=&classname& Type=&String& Category=&Name& Default=&MathProgram& %&
public class &%=classname%&
  public &%=classname%& ()
   }
这样,可以通过Properties窗体来改变类型的名字,而不用每次都改模板里面的Default的值&MathProgram&。
执行时的替换是什么意思?再体会这句话的含义:模板会被解析引擎转化为一个类型定义,然后会被动态编译成类型,调用它的方法输入类型的结果。在以前的文章《工作多年后才明白的.NET底层开发技术》中提到过的工资公式编译器,也是这个原理:通过构造一个类型,执行它的方法,最后取出执行结果,就是我们需要的生成后的代码。
代码看起来是这样的,生成程序集,调用指定的类型的方法,取方法的执行结果即可
Assembly assembly=CreateAssembly(sourceTemplate,parameters)
Type type=assembly.GetType(“Builder”);
InvokeMethod(type,”Render”, new object []{ “MathProgram”  });
自定义的程序集,可以通过下面的方式统一放到指定的目录中
        &assemblyBinding xmlns=&urn:schemas-microsoft-com:asm.v1&&
            &probing privatePath=&AddIProviders&/&
        &/assemblyBinding&
    &/runtime&
这个设置允许bin,AddIns,Providers目录都可以存放程序集文件,而不会发生Load时FileNotFoundedException。
多种语法形式的模板
.NET如今正统的语言是VB.NE和C#,曾经红火的J#,Delphi.NET都已经退出市场。Template Studio也要支持这两种语言的模板,语法仍然兼容于Code Smith的语法声明
&%@ CodeTemplate Language=&C#& TargetLanguage=&C#& Description=&Generates a very simple business object.& %&
VB.NET的写法如下
&%@ CodeTemplate Language=&VB& TargetLanguage=&C#& Description=&Generates a very simple business object.& %&
如果是用Language是VB,代码中需要定义变量或是包含代码段的地方,都应该用VB的语法方式
&% Private Const RUN_MULTIPLIER As Integer = 10  %&
&% For i = 0 To RUN_MULTIPLIER – 1  %&
     &%=Math.ApplictionName%& &%=i%&
&% Next i  %&
此外,在设计生成的类型时,还需要注意,要全部用VB的语法,而不是C#的语法代码。
在编译时,需要把编译器由CSharpCodeProvider换成VBCodeProvider,以正确编译生成的源代码类型。
Flexible and Plug-in-based using Provider Pattern  应用Provider模式实现灵活的插件式编程
ASP.NET发行之初,通过著名的论坛程序Community Sever和ASP.NET Forum,首先提出了Provider模式。
先抄写一段赞美Provider模式的段落语句
ASP.net 2.0 的 Provider 模型为开发者提供了将他们自己的实现作为一种特性加入到运行时的可扩展方法。Membership Provider 与 Role Provider 在 ASP.net 2.0 中都通过细化一个接口或者协议来遵循 Provider 的模型。如果你创建你的组件来实现 Provider 模型定义的协议,你可以插入你的代码到 ASP.net 运行时并且替换或者扩展已经存在的 Provider。在 ASP.net 2.0 的 Provider 模型包括一个 Provider 配置与初始化的基础结构。
再以下面的代码中的例子,帮助理解Provider模式
public abstract class ProviderBase
        p
        protecte
        public string Name { }
        public string Description { }
        public abstract void Initialize();
        public abstract void GenerateSchema();             }
    public abstract class  SQLServerProvider : ProviderBase
    {
        public override void GenerateSchema()   {  }
    }
    public class MySqlProvider : ProviderBase
    {          public override void GenerateSchema()   {  }
    }
    public static class SchemaProvider
    {
        static  SchemaProvider()
        {
        }
        static ProviderBase 
        public static ProviderBase  Provider { get { } }
        public static ProviderBase Instance
        {
            if(provider=null)
             {
                  swith(databaseType)
                  {
                       case DatabaseType.SQLServer:
                              provider=new  SQLServerProvider();
                             
                       case DatabaseType.MySql:
                              provider=new  MySqlProvider ();
                             
                   }
              }
            return provider
        }
正式的Provider的例子,会用到配置文件,我这里作了简化,直接用代码判断。
Provider模式在Template Studio中的应用举例
1)连接到数据库服务器,获取元数据的方法
2)模板代码的生成,VB和C#两种代码生成器,分别相同的类型的不同代码实现(VB.NET和C#)
代码生成器的高级主题
1)要支持批量代码生成。比如对一个数据表GBITEM,有实体ItemEntity对应,需要为它生成四个类型:ItemEntity.cs,ItemValidation.cs,ItemInterface.cs,ItemManager.cs
要支持,在一步的情况下,同时生成这四个类型,通常是四个UTF8格式的代码文件。
像LLBL Gen 3.x这样,把多个模板绑定到一个templatebinding文件中,传入一个llblgenproj项目文件
2) 模板生成的代码,要可以被第三方的工具调用。在我开源工具Smith Builder中,它的最有价值的代码,就是获取参数值,传放到模板中,批次生成代码。
如下面的代码所示,可以以代码方式调用,脱离IDE Template Studio的限制,灵活运用
用Code Smith SDK中的代码示例子,如下所示
Dim compiler As CodeTemplateCompiler
          compiler = New CodeTemplateCompiler(&StoredProcedures.cst&)
          compiler.Compile()
          If compiler.Errors.Count = 0 Then
              Dim template As CodeTemplate
              template = compiler.CreateInstance()
              Dim database As DatabaseSchema
              database = New DatabaseSchema(New SqlSchemaProvider(), &Data Source=.\SQLEXPRESS;AttachDbFilename=PetShop.Integrated Security=TConnect Timeout=30;User Instance=True&)
              Dim table As TableSchema
              table = database.Tables(&Inventory&)
              template.SetProperty(&SourceTable&, table)
              template.SetProperty(&IncludeDrop&, False)
              template.SetProperty(&InsertPrefix&, &Insert&)
              template.Render(Console.Out)
          Else
              Dim i As Integer
              For i = 0 To compiler.Errors.Count
                  Console.Error.WriteLine(compiler.Errors(i).ToString())
                  Console.Read()
              Next
          End If
这种能力的威力是巨大的,这意味着模板可以脱离IDE的存在,被第三方的工具集成。Code Smith 本身是不收费的,它只收费Code Smith Studio,集成化的编辑,调试模板的IDE。
也只有这个原因,它才会被ORM工具以API的方式所调用,如下图所示
ORM.NET是.NET 1.x时代流行ORM工具,可惜后来停止了更新。似乎可以应验开源死的说法,如果不开源,或是转向商业化,或许发展会好很多。许多项目一放到互联网上,就慢慢的停止更新了。
3)支持主流的数据库。SQL Server,Oracle,MySQL这些常见的数据库,都需要写程序集来获取元数据,用于代码生成。这不是难点,有现成的开源的Code Smith的Prover作例子。这里也可以参考《LLBL Gen 3.x 源代码追踪与解析 查询命令的追踪》中提到的Dynamic Query Enginee,DQE,动态查询引擎,对不同的数据库,引用不同的程序集。
在Template Studio这边,这不算是难点,但是放到ORM框架-工具-产品开发的全局来看(big picture),这一部分是ORM框架重要的特性部分:多数据库平台支持。ORM天生是数据库独立的,不依赖于数据库特性。
在讲解ORM框架-工具-产品开发的ORM框架时,这一部分再做重点讲解。
4).NET程序集中的多重定向
先回忆一个场景,VS2005发布之后,微软又陆续发布了WCF,WPF等.NET 3.0/3.5的技术。如果要编译的原代码的Target=.NET 2.0,而要引用的程序集的版本可以是.NET 3.0/3.5;当时可以用VS2005做到这一点。但是后来VS2008发布,这种好处消失,即使是现在的VS2010也做不到,无法用低版本Target的程序集引用高版本Target的程序集。
这会影响到什么? 假设TestClassLibrary编译是的Target是.NET 4.0,而运行模板的程序集,Template Studio的Target是.NET 20,如下所示的类型引用:
&%@ Assembly Name=&TestClassLibrary& %&
&%@ Import Namespace=&EPN.Common& %&
这会影响到执行结果。这个困扰,可以用下面的办法解决,将应用程序设置为在版本 3.5 上运行
&compatibilityversion major=&3& minor=&0&/&
&/runtime& &startup& &supportedRuntime version=&v3.5.7000&/&
&/startup&
阅读(...) 评论()

我要回帖

更多关于 小孩画图涂色模板 的文章

 

随机推荐