Visual Studio 2010的网站局域网发布功能(Publish)
以前部署asp.net网站时都是复制、粘贴,最近做了bat一键安装mysql和tomcat的setup。
就想vs有没有更酷更方便的功能呢?果然有,上午研究了下vs的远程发布asp.net网站的功能。
1,准备
- 一台开发机,安装了vs2010(vs2012也行)
- 一台局域网中的服务器(虚拟机也行),必须已经安装iis7(iis 7.5,8也行)
- 检查服务器8172端口是否能否访问(做测试就先把服务器防火墙关掉也可以,但是最好自己配置防火墙的例外)
- 我用的是英文版,麻烦童鞋们自己对照下中文版
2,在局域网中的服务器上安装Webdeploy
下载地址为:https://www.microsoft.com/web/handlers/webpi.ashx/getinstaller/WDeploy.appids
2,安装完成后,启动MsDepSvc和WMSVC两个服务
3,在局域网中的服务器iis上建立有效的网站test,参数童鞋们自己设置正确
4,在开发机器上,打开vs2010,右键选中web项目,选择Publish
- Publish Profile 就是你远程发布的配置名,我的名字为(vm)192.168.40.128
- Publish Method,还有其他几个选项,我这里选择的是Web Deploy(其他几个选项也蛮酷,它们有另外的应用场景)
- Service URL 就是你服务器的有效ip地址
- Sit/appliaction就是在第3步中建立的web站点名
- Credentials 一定要选择Allow untrusted cretiicate,然后输入服务器有效用户名和密码
- 点击Publish.
5,另外,你可以在右键菜单的Package/Publish Setting中设置发布内容等。
6,在局域网服务器iis中查看网站是否发布成功。
ok,如果你还不行,可以发下错误信息,大家都帮你看下。
DataGrid绑定Dictionary问题
【问题】
在最近的项目中使用DataGrid的DataGridCheckBoxColumn绑定了后台TagModel类的IsSelected字段,数据源是TagModel类型的Dictionary,运行发现Checkbox不能正常勾选,提示错误:此视图不允许“EditItem”。
【问题重现】
前台:
<DataGridCheckBoxColumn Binding="{Binding IsSelected}" />
后台:
Dictionary<string, TagModel> dicTag = new Dictionary<string, TagModel>(); TagModel tm = new TagModel (); dicTag.Add("Test",tm); dgTest.ItemsSource = dicTag.Values;
TagModel.cs:
private bool isSelected = false; public bool IsSelected { get { return isSelected; } set { isSelected = value; } }
运行后点击CheckBox就会弹出错误:此视图不允许“EditItem”。
【问题分析】
1.修改前台代码为:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsSelected}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
测试无问题。
2.不修改前台代码,修改后台代码为
Dictionary<string, TagModel> dicTag = new Dictionary<string, TagModel>(); TagModel tm = new TagModel (); dicTag.Add("Test",tm); List<TagModel> lstTM = new List<TagModel>(dicTag.Values); dgTest.ItemsSource = lstTM ;
测试也无问题。
分析:1.使用Dictionary的Values作为数据源时,DataGridTemplateColumn可以正常操作而DataGridCheckBoxColumn会报错,猜测这两种Column采用了不同的处理机制。
2.使用List复制Dictionary的Values作为数据源时,DataGridTemplateColumn和DataGridCheckBoxColumn都能正常操作,由于Dictionary的Values没有继承IList接口而List继承了该接口,猜测在使用没有继承IList的变量作为数据源时DataGridCheckBoxColumn和DataGridTemplateColumn的处理机制不同。
【问题解决】
通过MSDN版主Lisa Zhu的解释,最终弄明白问题所在http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/cd25f422-dabc-4d1c-a401-16f9b41c1dfd
- CellTemplate和CellEditingTemplate 两种情况,即:单元格不可编辑模式和单元格可编辑模式。
- DataGridCheckBoxColumn由CellEditingTemplate继承而来。
- 对cell进行编辑时,DataGrid的ItemSource 需要一个继承了IList<T>接口的集合,而Dictionary.Values 没有继承该接口,所以会报错。
- 这也就是为什么使用DataGridCheckBoxColumn会报错而使用CellTemplate不会报错的原因。
- 当使用List作为数据源,由于List已经继承IList接口,所以DataGridCheckBoxColumn和CellEditingTemplate都能够正常使用。
【总结】
使用Dictionary的Values作为数据源时需要将Dictionary的Values先复制到List中,再将List作为数据源绑定。
【P.S】
如果使用Dictionary的Values作为数据源并使用CellEditingTemplate 绑定,可以将该列的IsReadOnly设为True,则始终不会使用CellEditingTemplate属性值,就不会抛出错误。但同时也不能操作这一列了。
response各个方法总结
今天用到了response各个方法,在此总结一下:
在讲response以前首先说一下asp.net的输出流程:我们每一请求的输出并不是马上直接发送个客户端,而且先保存在内存中缓冲区中,这个缓冲区的.net实现就是System.IO.TextWriter类型的Response.Output,在我们页面的整个执行过程中就是不断向其中添加内容,当然也可以修改其中的内容,当我们整个页面执行完成后再将缓冲区的内容发给客户端。
第一个方法response.write():这个方法大家都非常熟悉了,就是“向客户端输出指定的内容”,其实根据上面讲到的"输出流程"我刚才说的“向客户端输出指定的内容”这句话是不准确的。准确的应该是向内容的缓冲区添加内容。就是因为这样我们才可以在以后的处理中随时操作刚才write的内容。(在webfrom中如果我们在page_load方法中使用response.write(),write的内容会出现在输出html的最前面,出现这个情况的原因是在我们调用response.write()时整个页面的内容输出还没有添加到缓冲区中,所以在缓冲区中刚才response.write()的内容出现在页面的内容前面)。
第二个方法是Response.Clear():这个方法只是清空缓冲区的内容,我们以后还可以继续向缓存区中添加内容。
第三个方法是Response.End():这个方法终结页面的执行,也就是Response.End()方法后面的代码不会在执行,并且引发EndRequest事件,最后将缓冲区中的内容输出。
第四个方法是Response.Flush():这个方法是马上将缓冲区的内容输出到客户端,但是程序仍然可以执行后面的代码并向缓冲区中继续添加内容,最终缓冲区的内容的多次添加并多次向客户端输出。(我对这个方法的可能理解不正确,如果大牛们知道确切的解释请帮忙解释下)