ASP.NET MVC小论

前言
      ASP.NET MVC作为微软官方的.NET平台下MVC解决方案,自诞生起就吸引了众多.NET平台开发人员的眼球。在经历了漫长Preview后,上个月微软终于发布了其beta版。应该说,通过我亲身实践,我认为这个框架的设计还是相当优秀的,至少从易用性来说,ASP.NET MVC要优于Java平台上的Struts和Struts2。使用Struts实现MVC时,除了要写一堆ActionForm、Action和ActionResult外,最头疼的莫过写于各种xml映射配置文件。Struts2虽然不用再写ActionForm,并且降低了侵入度(其实Struts2和Struts关系不大,而基本可以认为是WebWork的后续版本),但是仍无法避免xml配置文件。
      ASP.NET MVC从一开始的设计思路就与Struts不同,它的映射是利用路由配置而非xml,从而大大降低了开发复杂度,并且比Struts要更直观,更容易上手。
      可是,这并不表明ASP.NET MVC就是尽善尽美的。在我实践的过程中,发现某些地方使用起来还是不太方便,在这里小小论述一下。不妥之处,还请各位尽情批评。

别扭的视图:能不能不要让我承担逻辑
      我个人认为,ASP.NET MVC第一个不太妥当的地方就是视图的实现。在这个框架中,视图是使用ASPX文件实现的。就呈现数据这一需求来说,ASP.NET MVC下一般性的做法是:控制器负责调用Model完成数据的读取,并将需要呈现的数据通过ViewData传递给视图,并选择某视图呈现。被选中的视图要负责将ViewData中相应的数据读取、分解,然后使用一定的逻辑语句将其呈现。
      这个方式,就要求视图中存在一定的逻辑语句,如将ViewData中数据转换成相应类型的类型转换语句;如果需要按照某一条件呈现不同内容,则需要分支语句;而常用的表格式数据呈现需要用到循环语句。于是,我们就会看到视图中充斥着各种<%%>、if、foreach等等的东西。
      当然,我不否认,良好的编写可以让这些代码整洁的出现在视图中。然而,在我的心目中,一个良好基于Web应用的MVC框架设计,其视图是不应该存在任何可执行代码的,而应该是一个单纯的模板文件,或者说含有可替换标签的页面文件,就像PHP平台下的Smarty那样。至于视图中相应的可替换标签替换成什么内容,应该是控制器的责任。设计一套良好的标签模板,对数据、分支、循环等常见任务设置相应标签,我认为是更适合ASP.NET MVC的视图设计。一来,这样可以让视图真正“静态化”,更有利于逻辑和表示的分离;二来,美工可以更好的关注于仅包含html代码和标签的视图,而不用关注于可执行代码。

对Ajax的支持:仍然很不方便
      我们知道,现在在一个Web应用中加入Ajax元素是司空见惯的,微软当然知道这一点,所以在ASP.NET MVC中,天然支持ASP.NET AJAX和jQuery,并提供了一个AjaxHelper来完成一些辅助性操作。然而,这个AjaxHelper的功能真是远远不够。
      由于ASP.NET MVC的特性,导致某一个Action的Url不是固定的。所以在请求Action时,一般不是将Url硬编码在页面中,而是通过Html.ActionLink动态生成。这就出现了一个问题,Ajax请求怎么办?当然,对于点击链接或提交表单触发的Action,AjaxHelper有专门的辅助方法,但是,如果某个Ajax请求不是通过链接或表单触发的,就会很有问题。毕竟你不能把Url硬编码在js里。
      关于这个问题,没有太好的解决方案,目前只能用一些类似hack的方式。如将Url用Html.ActionLink写入某个span,再将这个span的display设为none。最后,js从span中读入Url进行请求。
      希望在后续版本中,ASP.NET MVC能对Ajax有更好的支持。

文档
      再一个我认为ASP.NET MVC不太理想的地方就是没有完整的配套文档。目前能找到的官方文档只有Quick Start,并没有完整的开发文档。也许是因为正式版还没有发布吧,希望配套文档能尽快推出。

后面的话
      虽然有以上诸多不便,但是ASP.NET MVC作为一个正在发展的框架,我个人还是很看好其前景的。希望它能越来越完善,给ASP.NET平台上的MVC开发带来更多的便利。

作者:T2噬菌体
出处:http://leoo2sk.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: MVC,.NET,ASP.NET MVC
posted @ 2008-12-04 11:11 EricZhang(T2噬菌体) 阅读(3328) 评论(49)  编辑 收藏 网摘 所属分类: 心得体会

  回复  引用  查看    
#1楼2008-12-04 11:43 | kiler      
没有那种方案可以解决不在表现层包含逻辑的问题,无论是webform还是mvc都没有彻底解决这个问题,相对来说MVC解决的好点。
  回复  引用    
#2楼2008-12-04 11:43 | john.geng[未注册用户]
非常赞同LZ关于视图的观点.
  回复  引用    
#3楼2008-12-04 12:03 | tom.chen[未注册用户]
很赞同LZ的观点,
  回复  引用  查看    
#4楼2008-12-04 12:15 | Q.Lee.lulu      
1、route部分如果不用XML来配置的话,你程序部署后你想改route规则就比较麻烦了,前几天我还介绍了一篇文章是说在ASP.NET MVC中实现用XML来配置route规则的
2、视图里面的类型转换,对于强类型语言这是无可厚非的,肯定没有Python的Django框架那样灵活。至于<%%>、if、foreach这些也是肯定必须的,只是WebForm写这些非常不灵活,比较烦,MVCContrib里面的几个模板引擎相对来说写起模板来代码就干净多了,只是都不成熟,比较多bug。我也希望M$能为MVC重新证一个模板引擎。
3、form的ajax嘛,你完全可以写一个普通的form,然后用jQuery来接管form的submit方法,url根本不用写到一个隐藏的span中那么麻烦。
4、文档确实是不齐全。

  回复  引用  查看    
#5楼[楼主]2008-12-04 12:31 | T2噬菌体      
@Q.Lee.lulu
刚拜读了你的“使用XML文件来动态配置ASP.NET MVC的Route规则”,受益匪浅

  回复  引用    
#6楼2008-12-04 12:34 | Yok。[未注册用户]
--引用--------------------------------------------------
kiler: 没有那种方案可以解决不在表现层包含逻辑的问题,无论是webform还是mvc都没有彻底解决这个问题,相对来说MVC解决的好点。
--------------------------------------------------------
表现逻辑可以并且应该放在视图里

  回复  引用    
#7楼2008-12-04 12:38 | hook[未注册用户]
单就易用性来说,ASP.NET MVC 当然要好过Structs, 但在其他方面,MS的这个框架就目前来说要逊色的多,多了去了。不知道LZ有没有用这个两个框架做过实际开发?
  回复  引用  查看    
#8楼[楼主]2008-12-04 12:41 | T2噬菌体      
@hook
都做过实际项目

  回复  引用    
#9楼2008-12-04 12:57 | hook[未注册用户]
其实,微软的这个MVC,真的很让人失望,其进度也很不符合微软的风格,都搞了那么久了,搞半天经常放鸽子,现在才是beta版本并且问题多多,比如如何在现在的MVC下实现多语言支持?这些貌似还没有很好的解决方案。而Structs天生就支持这些,那些标签,模板,这些MS还都没有;甚至我觉得其易用性还不如PHP的Zend.
我猜测微软之所以进度缓慢,估计有两个原因:
1.要考虑应用服务器的兼容。
2.要考虑与原有Asp.net控件模型的兼容,估计还要考虑IDE的兼容。
我甚至都觉得,微软应该单出一个IDE插件来开发MVC模型的ASP.NET应用。

从去年,就开始关注这个了,这个东西放在微软就这么难吗?

  回复  引用  查看    
#10楼2008-12-04 13:17 | JimLiu      
我如果有需要我就输出一个javascript代码var actionlink=...不过还是觉得不是很爽。
用jQuery直接接管form的工作,再来Replace也可以,但是这样交互的是文档,通常文档比较大,对性能没提升(显得有点像UpdatePanel了,虽然很方便,但是应用有限)。
如果要符合“Ajax的精髓”以数据为交互的中心,就的确得考虑在客户端获取ActionLink的问题了。
视图中的类型转换我觉得这是无可厚非的,而且似乎也不会造成视图多“难看”。老赵的WebCast里也提到过关于视图的问题,坚持“视图中只出现表现逻辑”这一点,是开发视图的一个大原则。比如就不应该在视图中去访问数据等等,本来Controller和Model交互的就是数据,不是内容,怎么显示当然由视图逻辑去确定,那视图中有逻辑不是理所应当了?

--引用--------------------------------------------------
hook: 其实,微软的这个MVC,真的很让人失望,其进度也很不符合微软的风格,都搞了那么久了,搞半天经常放鸽子,现在才是beta版本并且问题多多,比如如何在现在的MVC下实现多语言支持?这些貌似还没有很好的解决方案。而Structs天生就支持这些,那些标签,模板,这些MS还都没有;甚至我觉得其易用性还不如PHP的Zend.
我猜测微软之所以进度缓慢,估计有两个原因:
1.要考虑应用服务器的兼容。
2.要考虑与原有Asp.net控件模型的兼容,估计还要考虑IDE的兼容。
我甚至都觉得,微软应该单出一个IDE插件来开发MVC模型的ASP.NET应用。

从去年,就开始关注这个了,这个东西放在微软就这么难吗?
--------------------------------------------------------
不敢恭维
1、ASP.NET MVC不是不可以运行在IIS6下,而且一样可以做到无后缀名的URL。当然,性能会有所损失。
2、为什么要兼容ASP.NET的控件模型?首先请允许我武断地判断你说的是ASP.NET WebForm的控件模型,既然ASP.NET MVC和ASP.NET WebForm本来就是两个不同的思路,为什么要兼容?IDE的话,既然ASP.NET MVC本来就着眼于部署在.NET Framework 3.5的环境下,为什么要完全兼容Visual Studio 2005呢?本来就不是一代的产品。

  回复  引用  查看    
#11楼2008-12-04 13:21 | kiler      
@JimLiu
同意,兼容ASP.NET的控件模型是个很sb的做法,完全没有必要。

  回复  引用  查看    
#12楼2008-12-04 13:23 | 上不了岸的鱼{ttzhang}      
关于楼主说得视图中使用标签的问题,我有些疑问:
如果使用标签模板来呈现,那么,假如控制器执行相应的业务逻辑后,经处理模板标签后,呈现出视图,这时候,我们可能要更新页面的某一部分,执行这样的操作肯定也要由控制器来处理,这时候就只能使用模板重新生成整个视图了,实际上,我们只需要更新一小部分内容,这时候处理起来会不会很麻烦?
我不大懂ASP.NET MVC,随便说的哈

  回复  引用  查看    
#13楼2008-12-04 13:26 | 上不了岸的鱼{ttzhang}      
@JimLiu
支持10楼,兼容ASP.NET的控件模型和MVC可以说没有任何关联,在MVC中的View上可以不用任何的ASP.NET的控件。

  回复  引用  查看    
#14楼2008-12-04 13:29 | brightwang      
很赞同视图的观点,满屏的<%%>真的是很恶心,现在的项目进行了2个星期,我就快受不了了。
ajaxhelp都没有去用,感觉太鸡肋。

  回复  引用  查看    
#15楼[楼主]2008-12-04 13:42 | T2噬菌体      
@上不了岸的鱼{ttzhang}
我也觉得是这么回事,但是有时必须兼容,如母版功能,实现母版就是靠服务器端控件。可是兼容了又觉得……反正很矛盾的感觉

  回复  引用  查看    
#16楼2008-12-04 13:47 | JimLiu      
@T2噬菌体
服务端控件也得一分为二地看,有的服务端控件不需要在runat="server"的form里的,那种控件可以很好地用在MVC中,没有runat="server"只是少了一些依赖PostBack对控件编程的功能。但这不正是MVC和WebForm的两个思路吗?

  回复  引用    
#17楼2008-12-04 14:09 | hook[未注册用户]
@JimLiu
不知道你有没有仔细看过MVC生成的那些配置节点,如果不考虑兼容性,它需要这么费劲吗?
即使是这样,你在IIS6.0上部署,也要设置映射吧,并且在最初的版本里,要在IIS6.0中部署成功也很麻烦的。
IIS7.0当然要好的多,但微软显然知道,现在还是IIS6.0的天下。
至于我说的,要与ASP.NET控件模型兼容,我说的不是很清楚,我的意思是,即使在2008中开发也很不方便,你不觉得吗?
他要考虑你使用同一个IDE,开发MVC,和 基于ASP.NET控件模型的应用程序,比如说你做一个VIEW的时候,照道理来说,就不应该
出现那么多服务器控件在工具箱里,而是应该出现很多mvc特有的渲染标签。但现在它是这样的吗?

  回复  引用  查看    
#18楼2008-12-04 15:23 | Q.Lee.lulu      
@hook
为啥MVC要特殊的IDE呢?如果一个视图引擎可以让你很方便的在DW中进行视图的设计或者只是一个简单文本编辑器,那么这个视图引擎才是一个好的视图引擎,因为它关注的只是数据的显示,不应该有啥复杂的东西。
另:啥是渲染标签?

  回复  引用  查看    
#19楼2008-12-04 16:33 | brightwang      
我的亲身感受是一个熟练使用webform的人比起熟练使用asp.net mvc
的人或许开发速度上会高出不少,我刚开始用asp.net mvc时有点天真的
认为会提高我的工作效率,结果虽然我开发的很顺利,没有遇到卡壳的地方
,可是开发的速度却下降了不少。

  回复  引用  查看    
#20楼2008-12-04 17:13 | Jeffrey Zhao      
关于View的东西太较真了,foreach/for之类的循环根本也可以不视为编程语句,而是一种DSL标记。Controller负责的就是数据的输出,而不是数据的格式化,如果要Controller对应模板的“每个动态数据细节”这就是滥用职责的表现了而且事实上也只有编程语句(至少是类编程语句) + Helper方法才能真正保证客户端的灵活性和强大性,在这点上就算所谓“RoR”也不能避免。
至于楼上的“特殊IDE”也不敢苟同,当然如果您说要建立在非WebForm的ViewEngine基础上,这就是另一回事。
IIS 6,IIS 7……更别提了,根本没有兼容的问题。性能?好吧我承认理论上会“相对”略低一些,但是你的动态应用程序能够让这个性能问题成为瓶颈也算无敌了。

  回复  引用  查看    
#21楼2008-12-04 17:17 | 木野狐(Neil Chen)      
web 里的 mvc 怎么看怎么别扭。
  回复  引用  查看    
#22楼2008-12-04 17:23 | Jeffrey Zhao      
--引用--------------------------------------------------
木野狐(Neil Chen): web 里的 mvc 怎么看怎么别扭。
--------------------------------------------------------
我的经验是,别太想MVC“模式”和“框架的关系”,总之就是三块,该怎么做就做什么。

  回复  引用  查看    
#23楼2008-12-04 17:36 | kiler      
@brightwang
以前要是没做asp开发的话,你怎么也不会习惯mvc的,mvc适合那种对html有超强控制欲望的人。

  回复  引用  查看    
#24楼2008-12-04 17:43 | Q.Lee.lulu      
@Jeffrey Zhao
老赵有啥好的ViewEngine介绍没?这几天看了下Brail好像挺不错,只是很不完善...

  回复  引用  查看    
#25楼2008-12-04 17:44 | Q.Lee.lulu      
@brightwang
开发速度慢应该算是正常吧 ?

  回复  引用  查看    
#26楼2008-12-04 17:55 | Jeffrey Zhao      
--引用--------------------------------------------------
Q.Lee.lulu: @Jeffrey Zhao
老赵有啥好的ViewEngine介绍没?这几天看了下Brail好像挺不错,只是很不完善...
--------------------------------------------------------
其实我很喜欢WebForms作为ViewEngine

  回复  引用  查看    
#27楼2008-12-04 17:55 | Jeffrey Zhao      
--引用--------------------------------------------------
kiler: @brightwang
以前要是没做asp开发的话,你怎么也不会习惯mvc的,mvc适合那种对html有超强控制欲望的人。
--------------------------------------------------------
其实是看项目,不过其实WebForm也可以控制,很多控件是不污染页面的。而且最多像ASP.NET MVC那样写法。

  回复  引用  查看    
#28楼2008-12-04 17:55 | Phantaci.com      
@Q.Lee.lulu
Promesh.net的视图引擎不知道适不适合楼主。和Nvelocity类似。

  回复  引用  查看    
#29楼2008-12-04 17:58 | kiler      
@Q.Lee.lulu
看人,用的惯就快,用的不惯就慢。

  回复  引用  查看    
#30楼2008-12-04 18:04 | 冰凝零点      
关注了好久,个人很看好,只是感觉感觉对JS,HTML的技术要求太高了。。努力中
  回复  引用  查看    
#31楼2008-12-04 18:11 | Q.Lee.lulu      
@Phantaci.com
有时间的时候研究下

  回复  引用  查看    
#32楼2008-12-04 18:28 | JimLiu      
要把一个ProductId和ProductName转换为一个超链接,这再无可厚非不过了吧,这就是“视图逻辑”,或者说是“表现逻辑”,这种逻辑不出现在View出现在哪呢?或者说View中出现视图逻辑又问题吗?我喜欢用aspx,ascx,master这套ViewEngine的原因是因为可以用C#来完成视图逻辑,加上有Helper可以帮忙,我可以很轻易的完成视图逻辑,而不是其他一种我不甚了解的语法生疏的ViewEngine。
@hook
关于你说的IDE的问题,我不明白,因为我的控件面板都是设置成自动隐藏的。而且本来就有那些方便的Helper了,通过Helper可以完成几乎所有的视图逻辑,实在不行可以自己扩展一些辅助方法放在CodeBehind中,反正目前我是这样做的,没遇到什么问题。我没弄明白你所说的“渲染标签”是什么意思。

  回复  引用  查看    
#33楼2008-12-04 18:33 | JimLiu      
“然而,在我的心目中,一个良好基于Web应用的MVC框架设计,其视图是不应该存在任何可执行代码的,而应该是一个单纯的模板文件,或者说含有可替换标签的页面文件,就像PHP平台下的Smarty那样。”

我觉得这应该一分为二地看待,一方面是灵活性,如果能在视图中嵌入逻辑无疑对更好的控制生成的HTML是有帮助的。
如果不愿意嵌入逻辑,做成完完全全的模板形式,我相信以后会出现XSLT的视图引擎——但是我觉得视图永远不可能完全没有逻辑。

  回复  引用  查看    
#34楼2008-12-04 18:43 | Jeffrey Zhao      
@JimLiu
就是我想说的,支持你。

  回复  引用  查看    
#35楼2008-12-04 18:55 | Q.Lee.lulu      
@JimLiu
@Jeffrey Zhao
同意以上观点.
在view中没有逻辑是不可能的,例如用户没登录的时候显示个登录框,这肯定得有个判断的逻辑,你用任何模板都必须的.但是有些视图引擎写起来就比较简洁、好看,例如Brail的:
<ul><%for element in list: output "<li>${element}</li>"%></ul>
<% output AdminMenu(user) if user.IsAdministrator %>
但是如果用WebFrom来写我老觉得页面有点乱....

  回复  引用  查看    
#36楼2008-12-04 20:17 | brightwang      
--引用--------------------------------------------------
Q.Lee.lulu: @JimLiu
@Jeffrey Zhao
同意以上观点.
在view中没有逻辑是不可能的,例如用户没登录的时候显示个登录框,这肯定得有个判断的逻辑,你用任何模板都必须的.但是有些视图引擎写起来就比较简洁、好看,例如Brail的:
&lt;ul&gt;&lt;%for element in list: output &quot;&lt;li&gt;${element}&lt;/li&gt;&quot;%&gt;&lt;/ul&gt;
&lt;% output AdminMenu(user) if user.IsAdministrator %&gt;
但是如果用WebFrom来写我老觉得页面有点乱....
--------------------------------------------------------
如果一个页面既是新建(save)又是更新(update)用,那view将是非常难看的,判断将会很多。我现在采取和以前做webform一样的方法,
就是在.cs页面里写方法做些页面显示的逻辑,然后html页面将值传给。cs
页面的方法进行判断,可以减少<%if%>的数量。使页面更简洁些。

  回复  引用    
#37楼2008-12-04 20:24 | rrrr[未注册用户]
什么都好,就TM的aspx 里的< "" 内所有提示感知无效.....
  回复  引用    
#38楼2008-12-04 22:23 | CNS[未注册用户]
很明显,关于AJAX请求,Html.ActionLink肯定是不对的
MVC提供了Url辅助类,LZ没注意到?

  回复  引用  查看    
#39楼[楼主]2008-12-04 22:33 | T2噬菌体      
@CNS
如果不是通过链接或表单进行ajax请求,AjaxHelper无能为力

  回复  引用  查看    
#40楼2008-12-04 23:00 | JimLiu      
@brightwang
赞成把一些判断性语句写在CodeBehind中,CodeBehind是一个很好的Helper,但是不赞成把foreach这种语句写在CodeBehind,而应该写在aspx中,因为这是控制文档结构。

  回复  引用    
#41楼2008-12-05 08:23 | 何定昌[未注册用户]
对于mva bata,我资历浅,不敢评论,大家可看看我mvc bata开发的小应用:
http://www.gzsllzx.cn:8083,Ajax先用AjaxHelper,后来发现不灵活,又现从零学习并就应用jquery.请大家多提意见!

  回复  引用  查看    
#42楼2008-12-05 09:03 | kiler      
@Q.Lee.lulu
这个东西说白了就是个人喜好,webform一样的可以写的很优雅,看你怎么写而已。

  回复  引用  查看    
#43楼2008-12-05 10:16 | 初始小花      
--引用--------------------------------------------------
kiler: @brightwang
以前要是没做asp开发的话,你怎么也不会习惯mvc的,mvc适合那种对html有超强控制欲望的人。
--------------------------------------------------------
我就是那种对html有超强控制欲望的人,嘿嘿

  回复  引用  查看    
#44楼2008-12-05 14:07 | Ray Wu      
--引用--------------------------------------------------
Jeffrey Zhao: 关于View的东西太较真了,foreach/for之类的循环根本也可以不视为编程语句,而是一种DSL标记。Controller负责的就是数据的输出,而不是数据的格式化,如果要Controller对应模板的“每个动态数据细节”这就是滥用职责的表现了而且事实上也只有编程语句(至少是类编程语句) + Helper方法才能真正保证客户端的灵活性和强大性,在这点上就算所谓“RoR”也不能避免。

--------------------------------------------------------
非常同意老赵的观点,用过struts的模板标签,其原理就是if else,foreach这些逻辑,虽然说封装了一层,但是意义并不是很大。

  回复  引用  查看    
#45楼2008-12-05 18:00 | xjb      
--引用--------------------------------------------------
Jeffrey Zhao: --引用--------------------------------------------------
Q.Lee.lulu: @Jeffrey Zhao
老赵有啥好的ViewEngine介绍没?这几天看了下Brail好像挺不错,只是很不完善...
--------------------------------------------------------
其实我很喜欢WebForms作为ViewEngine
--------------------------------------------------------

同意

  回复  引用  查看    
#46楼2008-12-06 22:52 | Cat Chen      
我没怎么玩过ASP.NET MVC,不过我觉得它跟Rails非常相似,只是Rails发展了那么久已经比较成熟,ASP.NET MVC很多东西还没能学过来,或者说在选择学还是不学。

例如说Ajax的问题,Rails有解决方案,Nikhil个人的做法也是把Rails的方案搬到ASP.NET MVC中,但官方的版本还是没有完全抄Rails的做法,这证明Microsoft内部仍未对这个问题该怎么解决有所定论。

  回复  引用  查看    
#47楼[楼主]2008-12-06 23:35 | T2噬菌体      
@Cat Chen
呵呵,目前只能静观其变了。不过微软说正式版和beta不是有很大差别

  回复  引用  查看    
#48楼2008-12-06 23:52 | JimLiu      
@Cat Chen
Ajax整合我也觉得很不爽,AjaxHelper比较鸡肋,jQuery实现虽然轻巧难度也低但是总不是原生的,整合起来总觉得有层隔膜,不过毕竟还是Beta,正式版也许会有一个比较妥当的解决方案。
虽然说ASP.NET MVC跟RoR比的确难免有模仿嫌疑,但是不得不说ASP.NET MVC还是很不错的,有其独到之处,而且在我看来,向优秀的东西靠拢也是正确的,毕竟技术总得进步。

  回复  引用  查看    
#49楼[楼主]2008-12-07 10:51 | T2噬菌体      
@JimLiu
我赞同你的观点

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1347381 3kqgn4EheiM=



相关文章:

相关链接: