Hello World
Spiga

使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model

2011-09-05 16:21 by 老赵, 3807 visits

这也是之前在珠三角技术沙龙上的示例之一,解决的是在ASP.NET MVC使用dynamic类型Model时遇到的一个真实问题。C# 4编译器支持dynamic类型,因此在编写页面模板的时候自然就可以把它作为视图的Model类型。表现层的需求很容易改变,因此dynamic类型的Model可以减少我们反复修改强类型Model的麻烦,再配合匿名类型的使用,可谓是动静相宜,如鱼得水。不过,如果把一个匿名类型直接作为Model交给视图去使用,在默认情况下会抛出异常。我们可以用Mono.Cecil来改变这一情况。

在视图中使用dynamic类型Model

我们先来重现这个问题。创建一个使用C# 4的ASP.NET MVC网站,添加如下的Controller,其中把匿名类型作为视图Model:

public class HomeController : Controller
{
    public ActionResult Index(string title = "<<Default>>")
    {
        return View(new { Title = title });
    }
}

并定义一个Index.aspx作为视图模板,Model类型作为dynamic,并用到Title:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title>Index</title>
</head>
<body>
    <h1><%: Model.Title %></h1>
</body>
</html>

按理来说,这么做应该一切正常,但是运行之后便会提示说Model上找不到Title成员:

dynamic model load failed

这又是什么原因呢?

访问级别与成员

在C# 4出现之前,我们也完全可以构造一个Model类型作为视图的模型,例如:

public class IndexModel
{
    public string Title { get; set; }
}

使用这种做法便完全可以正常运行通过了。那么为什么具体类型能够正常工作,而匿名类型却失败了呢?“按常理推断”它们不都是普通的类型,然后访问它们的属性吗?我们用ILSpy查看使用匿名类型编译后的结果,可以发现匿名类型与上面的IndexModel有一个重要的不同之处:

internal anonymous types

由于是“匿名类型”,显然它的访问级别应该是internal的,这样它就能对外“隐藏”起来了。但是这就给ASP.NET MVC的视图带来了麻烦。因为ASP.NET MVC的视图会在运行时动态地编译aspx为额外的dll,因此它是无法访问到Controller所在程序集的internal成员的。经试验,如果我们将之前的IndexModel的访问级别修改为internal便会得到相同的结果。

额外提一句,类似的代码在Mono下却可以运行通过。这意味着在动态访问对象成员的时候,Mono和.NET在访问级别方面的检查是有所不同的。虽然在这个情景里Mono更方便,但理论上说,.NET的做法实则更合理。

使用NuGet安装Mono.Cecil

Mono.Cecil是Mono的组件之一,用来编辑.NET程序集文件。我们可以用它来打探一个.NET程序集内部的结构,就像反射那样,只不过并不需要将程序集加载进来,Mono.Cecil只是读取文件物理内容而已。例如,上图所用的ILSpy便用到了Mono.Cecil。更重要的是,Mono.Cecil可以修改并保存程序集,这便可以让我们实现各种奇形怪状的要求。像这篇文章所提到的,只不过是小试牛刀而已。

Mono和.NET是二进制兼容的,因此我们可以直接把Mono下的Mono.Cecil.dll复制并引用到.NET程序里。不过这么做还是麻烦了,如今在.NET平台上使用各种组件已经有更方便的做法:使用包管理器。.NET平台下的包管理器叫做NuGet,是由SubText的作者,后来被微软聘用作ASP.NET MVC程序经理的Phil Haack带头开发的开源项目。NuGet提供了Visual Studio的扩展,同时也有基于PowerShell的命令行。这里我们就从Visual Studio的扩展开始使用吧。

创建一个名为PublicAnonymous的控制台项目,并选择Reference - Manage NuGet Packages:

manage nuget packages

搜索Mono.Cecil,并安装即可:

install mono.cecil via nuget

NuGet会自动处理组件之间的依赖及项目的配置,您也可以自己把玩一番。

使用Mono.Cecil修改程序集

有了Mono.Cecil我们便可以修改程序集了,只需数行代码:

static void Main(string[] args)
{
    var asmFile = args[0];
    Console.WriteLine("Making anonymous types public for '{0}'.", asmFile);

    var asmDef = AssemblyDefinition.ReadAssembly(asmFile, new ReaderParameters
    {
        ReadSymbols = true
    });

    var anonymousTypes = asmDef.Modules
        .SelectMany(m => m.Types)
        .Where(t => t.Name.Contains("<>f__AnonymousType"));

    foreach (var type in anonymousTypes)
    {
        type.IsPublic = true;
    }

    asmDef.Write(asmFile, new WriterParameters
    {
        WriteSymbols = true
    });
}

首先,从参数中获取需要修改的程序集名称,找到所有的匿名类型,并将其访问级别设为Public后保存。保存的时候将WriteSymbols参数设为true,这样它也会同时修改pdb文件——这很重要,否则修改后的程序集无法和pdb文件内容相对应,便无法调试了。换句话说,Mono.Cecil也能正确处理pdb文件。

最后,只要在ASP.NET MVC网站编译时使用这个项目即可,只需配置一下它的Post Build事件:

post build scripts

再次编译并运行程序,即可得到正确结果。再拿ILSpy来检查一番:

public anonymous types

总结

在沙龙上,有朋友问我怎么样可以成为一个高级.NET技术人员。我不知道“如何成为”,但我想,了解整个生态环境的发展情况,了解.NET的优势及不足,甚至能够了解相关领域其他技术方向的发展态势,应该是优秀.NET程序员的特质之一吧。

而Mono便是.NET生态环境的重要组成部分。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

87 条回复

  1. 链接

    张志敏 2011-09-05 22:53:19

    明显是在炫耀技术, 虽然可以这样做,但是看不出这样做有什么优点,为啥不用 dynamic 的 ViewBag 呢?

    Mono.Cecil可以做的事情很多, 比如在 Silverlight 下, 可以在客户端分析程序集的引用情况, 进而做出按照 dll 进行按需加载的导航框架。

    http://www.cnblogs.com/beginor/archive/2011/04/29/2032563.html

  2. 老赵
    admin
    链接

    老赵 2011-09-06 00:43:15

    @张志敏

    看不出优点?这里的优点就是我能用匿名对象使用Model,保证开发人员体验:

    View(new {
        Data = ...,
        Text = ...,
        Sample = ...
    });
    

    而不需要:

    var model = new ViewBag();
    model.Data = ...;
    model.Text = ...;
    model.Sample = ...;
    View(model);
    

    在我看来,使用匿名对象对于开发人员是很直观的做法,必须支持。

  3. Roy
    114.245.220.*
    链接

    Roy 2011-09-06 01:02:00

    老赵这个修改是不是把GC里的库给改了?虽然改个访问权限也没什么,但是也会影响其他程序吧?

    我看你那个评论的差不多,呵呵

    View(new ViewBag{
        Data = ...,
        Text = ...,
        Sample = ...
    });
    

    这样是不是也行?

  4. xgluxv
    101.44.211.*
    链接

    xgluxv 2011-09-06 01:04:56

    传给View的Model和ViewBag应该在作用上是有分类的 他们分别负责不同的数据传递的吧。

    还有貌似ViewBag不是像老赵这么用的。应该直接:

    ViewBag.Data=....;
    ViewBag.Text=...;
    

    也不需要用View(ViewBag)传递。

  5. 链接

    张志敏 2011-09-06 01:07:32

    @老赵

    不要修改人家的名字好不好,另外,ViewBag 是这样用的

    http://davidhayden.com/blog/dave/archive/2011/01/19/ViewBagAspNetMvc3.aspx

  6. Terry Sun
    222.128.6.*
    链接

    Terry Sun 2011-09-06 01:10:08

    View(new ViewBag(){
        Data = ...,
        Text = ...,
        Sample = ...
    });
    

    View(new {
        Data = ...,
        Text = ...,
        Sample = ...
    });
    

    相比有何优点,第一种更直观不是

  7. 老赵
    admin
    链接

    老赵 2011-09-06 01:52:04

    @张志敏

    如果ViewBag是这样用的,那么我倒愈发觉得使用匿名对象传递Model的做法方便了。

  8. 老赵
    admin
    链接

    老赵 2011-09-06 01:53:25

    @Terry Sun

    第一种是指哪种?其实无论哪种更好,可能有个人口味在里面。就像我觉得匿名对象可以省下new一个具体对象,这样才好。

    而且就算不论口味,使用匿名类型的对象是一种很直观的使用方式,在我看来也是必须要支持的。而且支持以后也没有影响你使用ViewBag,甚至你可以这么做了:

    ViewBag.Post = new {
        Title = ...,
        Content = ...
    };
    

    你一样会遇到问题,还是要我这种做法来解决。

  9. xgluxv
    101.44.211.*
    链接

    xgluxv 2011-09-06 01:55:09

    看到微薄里的评论 果然水平太低 没有领会到老赵的深意 把我前面的留言删掉吧

  10. 老赵
    admin
    链接

    老赵 2011-09-06 01:55:37

    @Roy

    什么叫做把GC里的库也修改了?这个类型就是给视图用的,为什么会影响其他程序?

  11. fengyjmax
    183.62.146.*
    链接

    fengyjmax 2011-09-06 01:56:31

    在编译时去修改程序集,嗯,是个不错的思路,可以去做很多有意思的事情。

  12. 两会
    58.23.255.*
    链接

    两会 2011-09-06 02:34:29

    强大的Mono.Cecil……

  13. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-06 03:13:40

    要我看,从业务角度上,这纯粹是没有必要的,

    其实在php上,解决方法很简单,就是用数组嘛。

    总的来说,我认为java和.net那么多的model类,意义都不大,大部分情况完全可以用一个hash表来解决。

    大部分动态语言中,model.field和model["field"]是一回事,这就是动态语言的灵活性原因之一。

    而像java,.net到处定义model类,改动一下数据库就要到处改类定义,实在是没有必要。java,.net在web开发上比不过php,就是因为花在技术上的精力太多。

  14. oyster
    116.228.221.*
    链接

    oyster 2011-09-06 04:46:55

    ViewBag 也没法访问第二级匿名类的属性。 如:ViewBag.P=new {title="hello"};

    view中 访问 ViewBag.P.title 一样出错,所以我觉得老赵这个还是很有价值的。

    而且也不麻烦嘛~

  15. 老赵
    admin
    链接

    老赵 2011-09-06 05:56:25

    @mcpssx

    表现层动态,业务静态,多好的结合。你只知道动态语言的好处而不知道静态的好处,还把各种Model啊,领域驱动设计否决掉,这种就完全没什么好说的了。还有说改动下数据库就到处改定义,只能说明你落后于实践很多年了,还有你做的东西真是简单到直接映射下就可以了,像PHP一般Quick and Dirty。

  16. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-06 06:23:01

    正是从实践来说,所以开发一个web根本就不需要你这么复杂的技术,正是你说的php的都够用了,还要用从mono中cecil来反射修改程序集?

    你觉得有哪个项目会这样实践用吗?

  17. 链接

    James Zhang 2011-09-06 07:06:42

    既然是匿名类型,那么在AssemblyInfo.cs 指定 InternalsVisibleTo("xxxx") 这样应该也可以解决吧。

  18. 老赵
    admin
    链接

    老赵 2011-09-06 07:23:02

    @mcpssx

    我可没说PHP够用了,是对你做过的项目来说PHP够用了,因为你做的项目都只需要简单的映射,到处是CRUD,没有逻辑啊领域模型设计之类的东西。

    其实吧,就你“唯PHP和MySQL为上”这种观点,都没什么好讨论的。还是那句话,你可以花点时间去跟别人说去,别再我这里耗着,世界上大把大把不用PHP和MySQL的人和社区了。

  19. 老赵
    admin
    链接

    老赵 2011-09-06 07:23:56

    @James Zhang

    这也行,只是ASP.NET的aspx自动编译出来的程序集没地方加这个。

  20. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-06 08:15:23

    @老赵: 我可没说PHP够用了,是对你做过的项目来说PHP够用了,因为你做的项目都只需要简单的映射,到处是CRUD,没有逻辑啊领域模型设计之类的东西。

    问题就是现实是从facebook到discuz,wordpress都证明web开发php够用了,php市场占有率远远超过jsp和.net,

    所以我说老赵你过于关注语言的语法细节,强调C#比java和php先进,强调php不够用,其实这些在web开发中意义微不足道。

  21. 老赵
    admin
    链接

    老赵 2011-09-06 09:07:20

    @mcpssx

    我不想重复之前说过的无数条理论,直接说结论了:WordPress用PHP之类的,不能证明PHP就多么够用了。市占率高想说明什么问题,知道什么是历史因素么?什么Facebook用PHP也是历史因素造成的,从Facebook出来的人做Quora,有人问他为什么选择Python,Facebook为什么用PHP,他说的一清二楚。

    不针对技术作分析,而用各种侧面理论来“证明”,所以说你没有技术人员风骨。跟某理论一样:因为中国人口最多,因此中国政府最好。给点对的起来的逻辑吧。拿出点新意来,反复说几个月前的东西,一点进步都没有。

  22. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-06 09:41:11

    从够用的角度来分析,是现实就是如此,这跟什么中国人口多证明政府好的逻辑不同,因为wordpress确实就是最好的blog程序,而中国政府并不是最好的政府,你能举出.net写的哪个web程序套件比对应的php好?

    至于说Quora用什么了,那不能证明php不够用,正如myspace使用了.net不能证明php就不够用了。而且那也只适用于quora,对国内的广大用户是不适用的,因为你并没有他们那样的技术实力和人力资源大环境。

  23. RexZhao
    147.8.179.*
    链接

    RexZhao 2011-09-06 09:58:54

    修改效果很漂亮,修改方式感觉有些难以接受。不过很欣赏你的高质量博文。

  24. 老赵
    admin
    链接

    老赵 2011-09-06 13:40:58

    @mcpssx

    世界上没有比StackOverflow更好的问答网站了(产品好),比MySpace流量高的网站也凤毛麟角(性能高),但是我知道这个么你肯定会说做不了数,各种阿猫阿狗理由我都能帮你回忆起来。产品质量跟技术有关系么,技术只要过得去,产品什么都可以补的上,说了历史因素太重要了。

    算了不谈了,都看得出来你没法说服我,我也不可能说服你。

  25. 老赵
    admin
    链接

    老赵 2011-09-06 13:41:41

    @RexZhao

    修改方式为什么令人难以接受?

  26. mathgl
    203.218.7.*
    链接

    mathgl 2011-09-06 15:27:52

    说php总会说facebook...貌似facebook也用了很多erlang捏....

  27. chensheng
    60.29.35.*
    链接

    chensheng 2011-09-07 00:58:33

    这样做有点为为之而为之的意思,个人感觉还是没必要 只是个人习惯而已。个人观点view继承的Model最好是强类型寓意明确的,而匿名如果用在传递 数据上 应该实用些简单的数据,例如“title,validate”之类。(如果你的view数据足够的简单 也可以这样做~~完全不用Model 一段脚本 call 一个 action返回json效果应该比这样更简洁,无需Model之类),dynamic是在程序运行的时候动态解析的,应该需求针对业务背景的时候再用(runtime)。可能是为了显示Mono的强大吧,所以哪都想试上几分。浅见!

  28. 老赵
    admin
    链接

    老赵 2011-09-07 01:37:57

    @chensheng

    有个东西需要搞清楚的是,我是先遇到了这个问题,再用Mono.Cecil去解决,而不是想要用Mono.Cecil再去搞出这么个问题来。除非你给出一种更好的做法,那说不定我是“为了显示Mono强大”。事实上我之前也写过文章来用另外的方法解决这个问题,没有现在的好。

    至于View的Model是强类型的,我以前也用过,只是麻烦而已,这是个人的选择。我现在更倾向于在表现层这里使用动态类型的,无数人也和我有相同的选择。

    至于你说的简单的数据,JSON之类的,就实在让我摸不着头脑了。JSON是一种最终表现形式,输入View,而我现在的View是HTML。在得到无论是JSON还是HTML之前都需要最终的内存里的“数据”,这个“数据”才是这里的“匿名对象”,还没有到表现形式这个阶段。这部分概念也必须搞清楚。

  29. AntiGameZ
    121.229.64.*
    链接

    AntiGameZ 2011-09-07 17:15:47

    不知道老赵有没有看过Rob Conery的Massive ORM:https://github.com/robconery/massive

    你所讨论的问题,恰恰是我使用Massive以来,一直困扰着我的问题。

    看了上面的评论,忍不住还是得留下一个深深的感谢。

  30. 梁利锋
    114.252.66.*
    链接

    梁利锋 2011-09-08 08:52:20

    要访问其它程序集的internal成员,用友元就可以了。

  31. 老赵
    admin
    链接

    老赵 2011-09-08 13:23:20

    @梁利锋

    是不是都没看这里是什么场景啊?您来个友元看看?

  32. 浙江油烟机
    125.115.49.*
    链接

    浙江油烟机 2011-09-09 06:00:41

    你通不通过我的留言,我就在那里,不悲不喜

  33. StrongBird
    168.159.144.*
    链接

    StrongBird 2011-09-09 09:56:28

    虽然老赵的方式的确是蛮有意思,但是我同意用ViewBag的方式更加贴切。 因为当你定义一个匿名类型的时候,你就应该默认认为它不该暴露出来,它就应该是Internal的。ViewBag正是做了这一层的包装,然后让外部程序集可以访问。但是手动改程序集,未免和设计的初衷有违背。 当然,对于用Mono.Cecil的这个过程还是让我受益匪浅,有了Mono.Cecil的确可以创造出许多新思路来。

  34. 老赵
    admin
    链接

    老赵 2011-09-09 15:30:33

    @StrongBird

    现在我用匿名类型就是想方便地暴露出公开的信息,没有人说过匿名类型就一定是不暴露出去的。

  35. StarOcean
    202.107.218.*
    链接

    StarOcean 2011-09-10 14:42:42

    赵老师好! 前面说的:“还有说改动下数据库就到处改定义,只能说明你落后于实践很多年了” 我是asp.net新手,现在还是改了数据库就得改model,当然是用自动生成器 请问除了文中的办法有什么办法可以不用改model呢。。

  36. 老赵
    admin
    链接

    老赵 2011-09-10 15:36:07

    @StarOcean

    就是代码自动生成器啊,“到处改定义”是指“手动”的,自动的当然就不算到处改了。

    还有,文中的办法跟这个其实一点关系也没有……

  37. StarOcean
    115.218.85.*
    链接

    StarOcean 2011-09-12 09:58:10

    哈哈,3Q,其实文章没大看懂。评论倒是都看了,原来就是指生成器呢~

  38. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-14 05:00:04

    微软这次推出了WindowsRunTime, 用c++对象化了win32, 微软程序员又要投入到新的学习中去了。

  39. 老赵
    admin
    链接

    老赵 2011-09-14 09:14:03

    @mcpssx

    动辄上来挑点事情,果然是看我好欺负嘛。还是那句话:有本事找强硬的人去。

    看了一个Session你又什么都懂了,果然是有十多年经验的牛人啊。而且我不信你真会看Session?还是就看了两张PPT?那么请你告诉我要学哪些东西?要学多少东西?没搞清楚之前学会闭嘴有那么难么?

    Win 8有新功能,多点API很正常,触屏懂么,你用现有技术开发个触屏的?更何况我都不了解Windows Runtime是什么,Runtime的修改会带来多少编码上的变化,谁都不清楚。而且我可以跟你打赌,.NET类库保证和现有兼容。

  40. gakaki
    180.159.223.*
    链接

    gakaki 2011-09-15 01:07:24

    其实这就是ruby py lua js等语言提成的 meta programming 动态时修改运行时修改程序代码。。。

    其实java流涌aop之流的技术就是为了克服静态语言的弱点

    光看代码html +css 开发window 8 要比sl + c#代码量要少

    但还是要编译js 感觉有点失去了js在浏览器里的爽快感还要速度

    xaml布局不怎么样还有。。。。

    还有windows8里的sdk C#貌似直接支持async 语法了 C#5的

  41. gakaki
    180.159.223.*
    链接

    gakaki 2011-09-15 01:12:57

    如果楼上的同学们 有同时用 java 流 mvc框架 php的框架和ruby on rails的框架,就知道老赵为啥这么做了

    除了ror 其他都是assign php的smarty template,asp.net mvc 用viewbag来吧数据放进去

    ror 直接实例变量就可以,你说从语言层面来说哪个爽

    这样我可以省掉一个 assign语句了。。。

  42. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-15 04:23:14

    看了一个Session你又什么都懂了,果然是有十多年经验的牛人啊。而且我不信你真会看Session?还是就看了两张PPT?那么请你告诉我要学哪些东西?要学多少东西?没搞清楚之前学会闭嘴有那么难么? Win 8有新功能,多点API很正常,触屏懂么,你用现有技术开发个触屏的?更何况我都不了解Windows Runtime是什么,Runtime的修改会带来多少编码上的变化,谁都不清楚。而且我可以跟你打赌,.NET类库保证和现有兼容。

    如果是int i = i + 1,那这个语法当然兼容了。

    不过要用WinRT,显然又要学新的类库了,比如说集合库又有了 Windows.Foundation.Collections空间,IIterable,IIterator,IVector,IVectorView,IMap,IMapView

    界面上,微软又告诉我们,你无法将现有.net程序转化到新的metro app,

    微软列出了一长串需要大家更改的代码

    • UI changes
    • I/O changes
    • Storage changes
    • Threading changes
    • Reflection changes •Changes in general .NET Framework types

    光看这个,就知道微软程序员又要投入到新类库的概念和代码的学习中去了。

    我预计,cnblogs首页又要写各种hello,world的方法了,这就是我以前说过的,微软程序员的站点总是充斥着各种不同的hello,world的写法。

  43. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-15 04:54:36

    从WinRT来看,微软从.net上后退了,不再是wpf这种纯.net结构,WinRT使用c++ cli的语法开发的native c++程序,通过所谓Abi接口来跨语言调用,c++使用引用计数进行内存管理,其实就是回到了以前的com时代,只不过不再使用idl而是扩充c++语法一次编译了。

    微软使用native c++来做新的界面库,其实也反应了以前.net的wpf的性能有问题。

    好消息是,微软又放出了winRT的用C++, js, c#, vb四种写法新的hello,world例子

  44. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-15 09:02:02

    你无法将现有.net程序转化到新的metro app

    Existing Silverlight and WPF applications can be ported to the new “Native XAML” libraries with minimal effort.

    第一天的keynote上那个程序员帅锅就演示了把Scott Guthrie的SL app port成metro app

  45. mcpssx
    183.94.0.*
    链接

    mcpssx 2011-09-15 13:30:18

    @zzfff

    微软是这么说的:

    Typically, you will not simply convert an existing .NET Framework application into a Metro style app. Building a Metro style app requires that you redesign the .NET Framework application for the new user experience.

    事实上,从技术上来说,也很明显,

    Windows Runtime和.net framework WPF是两套技术,一套是用native C++开发的,一套是用C#开发的,共同点就是很多类名是相同的,就像VB6当年移植到VB .net一样,确实有很多代码是可以移植的,特别是hello,world型的,但也绝不是什么都可以移植的,微软当年还演示过j++的WFC框架是如何移植到J#去的。

    When you convert UI code from a Silverlight or Windows Phone application, you can use many of the same UI types, but the types are now located in the Windows.UI.Xaml namespaces instead of the System.Windows namespaces. These new UI types are similar to the previous .NET Framework UI types but contain some different members

    这又是微软一件很搞人的事情,微软又搞出了一套新界面库来,上次微软用WPF替代WinForm的时候,不知道是真么说WPF的生命周期的,在WPF基本上没几个人用的时候,又推出了一套基于C++的WindowsRuntime来。

    我听说老赵去IBM就是要开发WPF和WCF的,那就不知道老赵你是现在就换成Windows Runtime呢,还是等写完了WPF再移植到Windows Runtime去呢?

    总之,Windows Runtime其实是一个倒退,倒退回了当年的COM的二进制跨语言阶段,事实上,10年前,jscript就可以调用com组件,现在与当年的区别就是,当年是使用标准C++结合IDL来开发,现在使用了类似C++/CLI的语法来开发微软说得native C++ component提供给javascript和.net framework调用。

    看来以后windows开发.net确实可以绕过去了,你用native C++的windowsRT组件配合新的javascript模型就完全可以不用.net framework.

  46. mcpssx
    183.94.0.*
    链接

    mcpssx 2011-09-15 13:39:58

    而微软这套WindowsRuntime,又打击了mono,

    微软为了开发WindowsRT,把本来就很复杂的C++又加入大量的新语法扩展,什么ref new

    mono不大可能去实现这么一个C++编译器,而微软又在WindowsRT又加入了一大堆Windows打头的C++类库,mono是否有精力去用C#再去实现一把?而引入windowsrt后,windows平台上的.net程序员很又可能会使用windowsRT提供的新的collection啊,socket啊,异步啊之类。

    这就是说在windows上开发的.net程序将更难在mono上移植,最后mono可以移植的就剩下加减乘除之类的与系统无关的东西了。

  47. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-15 14:10:10

    @mcpssx

    其实windows需要面对的是两个基本独立的群体:生产群体与消费群体。前者的典型动作是用键盘鼠标操弄着office、企业应用客户端,后者的典型动物是抚摸着愤怒的小鸟;前者的最佳环境是desktop mode,后者的最佳环境是metro mode。

    苹果是消费电子公司,主打后一个群体;微软是软件公司,超大胃口的软件公司,两个群体通吃。

    老赵在IBM,肯定还是面对的是生产群体,基本可以忽视metro那一套。

    简便现在做企业应用客户端,出于各方面的妥协,也许winform是最佳选择。

    (你FUD得比较有水平,我比较佩服)

  48. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-15 14:11:20

    即便现在做企业应用客户端

  49. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-15 15:13:08

    企业应用客户端可能是:HTML+JS,浏览器中的silverlight,standalone app(wpf,winform),没用过metro,没想象力。

    企业应用服务端:asp.net,wcf,wf,appfabric,sharepoint server,biztalk server,sql server...开发只有.net一条路,和WinRT半毛钱关系都没有。

  50. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-15 15:17:52

    企业应用客户端还可能是:office + VSTO

  51. mathgl
    218.103.184.*
    链接

    mathgl 2011-09-15 16:23:04

    有水平的FUD还是fud嘛...这么好精力和老赵较劲,为啥不和Miguel de Icaza 说说看呢?

  52. 麦子
    114.80.133.*
    链接

    麦子 2011-09-16 09:25:51

    支持老赵,我也喜欢直接new一个匿名对象

  53. 老赵
    admin
    链接

    老赵 2011-09-17 04:03:51

    @gakaki: 但还是要编译js 感觉有点失去了js在浏览器里的爽快感还要速度

    编译不编译,跟开发人员又无关。现在的JS不编译吗?只是你不知道它在编译而已。

  54. 老赵
    admin
    链接

    老赵 2011-09-17 04:07:37

    @mcpssx: 而微软这套WindowsRuntime,又打击了mono。这就是说在windows上开发的.net程序将更难在mono上移植,最后mono可以移植的就剩下加减乘除之类的与系统无关的东西了。

    你完全就没搞懂Mono现在是在做什么。Mono从来没有要在Windows客户端上搞什么,比如WPF之类的,Mono从来就没有搭理过,那么现在Windows提供了Metro客户端有什么问题?Mono照样走服务器端发展路线,以及传统的.NET Core。至于C++,VB,JS之类的无所谓,Mono从来就是只搞C#。

    你为什么总是为了搞FUD而乱说,了解点东西再说很难么。

  55. 老赵
    admin
    链接

    老赵 2011-09-17 04:13:11

    @mcpssx

    你说的太多,我懒得一一应付了,就统一说几句。

    你又开始关心WinRT是怎么实现的?最后用.NET之类的调用不就可以了?你觉得WPF会被抛弃?我只能说微软的兼容性做的无敌的,虽然你从来不承认,但就是事实。WPF的精髓,XAML之类的开发模型被进一步发扬光大了,你也一并无视。

    你看到需要修改的地方就以为大动干戈,而不关注可以保留的地方,每个Profile都会有所不同,但你怎么不关注绝大部分不变的地方?告诉你“不能直接存文件,要用指定API存”,你就觉得麻烦的要死?

    提供新的组件和功能再正常不过了,现在Win 8走的是消费者路线,既然提供了新功能,自然会有新的类库?iOS提供新功能没有新类库?你以为人人都是做Server的?.NET的Server端变了没有?你以为人人都像Linux在消费者方面随便搞搞甚至不搞就可以了?

    说你高级FUD是抬举你,多混过几年,多知道一点名词,的确能够唬住乍一眼看上去的人。

  56. mcpssx
    183.94.0.*
    链接

    mcpssx 2011-09-17 07:16:33

    @老赵

    你关WinRT是怎么实现的?最后用C#之类的调用不就可以了?

    当然不一样了,这说名.net的地位大幅度下降,微软以后抛弃.net都是有技术基础的。各位应该热爱学习新技术,比如说新的c++。

    你觉得WPF会被抛弃?我只能说微软的兼容性做的无敌的,虽然你从来不承认,但就是事实。

    从mfc、wfc,winform、wpf,它真么个兼容了?

    微软的兼容是针对客户而言的,从来不是开发人员。你还没看winrt吧?你去看看WinRT类库就知道了,微软以后会同时维护两套功能一样的东西?

    winrt和wpf做一样的事情,你认为微软回维持wpf?

    你看到需要修改的地方就以为大动干戈,而不关注可以保留的地方,每个Profile都会有所不同,但你怎么不关注绝大部分不变的地方,结果告诉你“不能直接存文件,要用指定API存”你就觉得麻烦的要死?

    当然了,你肯定从来没有修改过以前的项目,你转换过vb6的项目到vb.net,j++的wfc到j#,winform到wpf,或者wpf到silverlight?

    提供新的组件和功能再正常不过了,现在Win 8走的是消费者路线,既然提供了新功能,自然会有新的类库?

    我看你没看过winrt吧?比如说winrt的platform::string和.net的string,winrt的Windows.Networking类库和.net socket功能有什么大的区别?

    明显就是用com技术重新实现了.net类库的功能。

    那么微软以后会维持两套同样功能的东西?

  57. 老赵
    admin
    链接

    老赵 2011-09-17 07:58:01

    @mcpssx

    开发人员也是客户,你知不知道什么是兼容性?就算像你说的,微软维护两套东西还少么?.NET发展十年了,C++被消灭了?现在就算是换个命名空间你就会说.NET又被推翻了。还说我没有移植和围护过项目,简直是笑话。我还没看过WinRT?我看的Session绝对多过你。

    不如你可以说说看.NET什么时候会被抛弃吧,我们可以打个赌,赌个几千块钱也没关系,这种赌我有好几个正在进行中。微软发展.NET你说发展太快,微软提供其他选择你又说.NET会被抛弃。你永远找得到各种理由来扯皮。

    既然完全听不懂我的话,反复强调自己说过了无数次的也被回应过无数次的道理。我相信你是故意的,所以我不会再回应你什么了,除非我心情好。对了,还是那句话:拜托你写点东西出来。

    现在不如就打个赌吧。

  58. 老赵
    admin
    链接

    老赵 2011-09-17 08:08:40

    说起来我做人真是太有准则了,博客上不删评论,微博上不加黑名单,果然就容易被人找上门来啊。真是比不上行业里的好多高手,指点江山。

  59. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-17 11:41:58

    这是个消费横行、消费至死的时代,乔布斯是消费主义的符号。大家快去研究WinRT吧,说不定会演绎一曲“愤怒的大鸟”的传奇呢。

    从80年代个人电脑的兴起,到新世纪消费电子的流行,苹果无疑是革命先行者,也是微软的精神导师。90年代学生打败老师的一幕会在10年代重演吗?“历史总是惊人的相似”这一魔咒会失灵吗?师母已呆!

    老赵的小宇宙快爆发了,难道是世界末日的先兆?

  60. mathgl
    116.10.98.*
    链接

    mathgl 2011-09-18 05:51:47

    @老赵: 你完全就没搞懂Mono现在是在做什么。Mono从来没有要在Windows客户端上搞什么,比如WPF之类的,Mono从来就没有搭理过,那么现在Windows提供了Metro客户端有什么问题?Mono照样走服务器端发展路线,以及传统的.NET Core。至于C++,VB,JS之类的无所谓,Mono从来就是只搞C#。

    我怎么感觉现在用mono的人 大多是做移动开发的呢? 在server应用Mono 好像没什么很令人深刻的例子。

  61. mcpssx
    183.94.1.*
    链接

    mcpssx 2011-09-18 11:25:58

    @老赵

    开发人员也是客户,你知不知道什么是兼容性?就算像你说的,微软维护两套东西还少么?.NET发展十年了,C++被消灭了?现在就算是换个命名空间你就会说.NET又被推翻了。

    可是c++已经不知主流了,比如说老赵你,据你说你就不会C++,这在10年前是不可能的,10年前vc都不会也能说是微软技术高手?

    当然了,现在微软又转回去了,光会.net不会c++就很难说是你说的“.net高级技术人员了”。因为.net的基础已经变成了C++写的winrt了。

    还说我没有移植和围护过项目,简直是笑话。我还没看过WinRT?我看的Session绝对多过你。

    那我就问你一个问题,WinRT中有c++写的platform::string,那请问这个.net的c#写的string是什么关系?是一个还是两个?为什么会有两个?

    不如你可以说说看.NET什么时候会被抛弃吧,我们可以打个赌,赌个几千块钱也没关系,这种赌我有好几个正在进行中。微软发展.NET你说发展太快,微软提供其他选择你又说.NET会被抛弃。你永远找得到各种理由来扯皮。

    没必要,vb6现在也可以用,j++的WFC现在依然可以运行,VFP虽然不发展了,但毕竟不是还在那里吗?微软抛弃的是程序员,微软还是会让.net能运行的。

    只是微软的高级技术人员必须是学C++的。

    总之,博客园那一大堆WPF文章是没有用了。

    现在不如就打个赌吧

    微软的windows runtime使用native c++写的(很多功能与.net framework是重复的),这就是最好的说明了。你总不能说以后看不懂WinRT代码,也号称高级.net技术人员吧?

    我提醒你一下,C++比C#复杂许多,而微软这次又加入了一大堆微软特有语法扩展,不知道老赵你学过C++/CLI没有?

    总之,微软“高级”程序员们必须要学习C++了。正如你说得

    有朋友问我怎么样可以成为一个高级.NET技术人员。我不知道“如何成为”,但我想,了解整个生态环境的发展情况,了解.NET的优势及不足,甚至能够了解相关领域其他技术方向的发展态势,应该是优秀.NET程序员的特质之一吧。

    以后.net高级人员不懂C++那是没有资格号称高级的。

  62. mcpssx
    183.94.0.*
    链接

    mcpssx 2011-09-18 14:06:17

    微软提供其他选择你又说.NET会被抛弃

    微软提供的其他选择(windows Runtime)根本就不是.net的,当然可以认为微软在降低.net的地位。在微软的新架构中,C#的地位就是一个静态的js。

    微软发展html5,也意味着降低了silverlight的地位,html5是可以代替flash的,当然也就可以替代掉与flash对等的silverlight。

    总之,这都意味着在客户端开发中,微软程序员需要重新学习框架了

    而在服务器端,本来asp .net就不在企业界和互联网上是主流,大众点评网已经转向java了,而反过来几乎没有听说从java、php转换成.net技术的,mono现在重点是iphone和android的客户端开发,其实也是因为.net在服务器端没有什么作为,没有建立起支撑mono公司生存的生态环境。你看php的zend公司就没有说主力转向手机客户端。

    老赵同志总是对我有误解,我来这里,不是为了去fud什么,而是探讨对前沿技术的看法。兼听则明,所以我才与.net的支持者交换看法,否则在java、php界我是难以得到反面意见的。

  63. 老赵
    admin
    链接

    老赵 2011-09-18 15:30:58

    @mcpssx: 老赵同志总是对我有误解,我来这里,不是为了去fud什么,而是探讨对前沿技术的看法。兼听则明,所以我才与.net的支持者交换看法,否则在java、php界我是难以得到反面意见的。

    没打算跟你讨论技术,你既然找了个冠冕堂皇的理由来,那么我也回应一下。

    我不觉得对你有误解,我反感你对待技术的态度。我说你FUD,不是因为你“打着FUD的旗号”过来,而是你一贯的说话的方式。我是搞技术的,不了解东西之前不发表意见。看到一个现象不会轻易地归因,而不像你的思考方式,看到一点现象,马上就来“探讨前沿技术的看法”。

    比如,C#做更多事情了,你就认为是“转向”,但C#什么时候说它只用来做一件事情了?它去任何市场都不奇怪,反而如果只做一件事情,你估计就又会说它应用范围狭窄了吧。想挑一件东西的错误还不容易?我不是不懂你们的说话方式和逻辑,只是不想这么去搞而已,我又不是第一天看到你这种说话方式的人,只不过你是第一个盯着我这个地方,而且我强调无数次“方式”之后还是我行我素的人。

    如果你想要“兼听则明”,麻烦去业界评论家那里,或者某个综合性的讨论前沿事物的或是支持.NET的社区,或者随便搞个Stack Overflow帖子,信息量大了去了。我个人不知道的东西太多了,这不代表什么,我从来只觉得自己知道点技术而已,还不算专注于.NET,更是毫不掩饰自己“不懂前沿”,“不懂预测”。你来我这儿只能说名离兼听则明十万八千里。我是纯粹的程序员,思考方式跟你们不同,你这样地发表意见只会让我产生反感。

    我只想跟技术人员交流,而不是业界分析师。所以我一直说,你既然知道那么多,拜托写点东西出来,但你各种理由就是从来不写。所以,我是完全不会对你产生尊重的,现在更不会有正经的交流,所以我觉得你也不太能够在我这里得到点什么,你是得不到你所谓“想要的东西”的。

    在我看来你早该知道这点,所以我实在无法理解你是真的来“交流”,虽然说的那么好听。话都说到这份上了,你应该明白我的意思了吧。我很感兴趣你接下来会不会来的更起劲。我只知道,你下次如果还不改这种“交流”方式的话,就不要打着“兼听则明”,“交换看法”这种冠冕堂皇的理由了。不如直接说是来找事儿的吧,我还更欣赏有性格的人。

    他妈的我又在你身上浪费了十几分钟时间。

  64. 老赵
    admin
    链接

    老赵 2011-09-18 15:32:48

    @mcpssx

    你就没有想过WinRT是干什么的,用C++写WinRT太正常不过了,因为这是操作系统功能,当然用Native的,要知道它是需要给C#和C++还有JS调用的,怎么会用.NET写?难道用JS调用和用C++调用时WinRT接口时还需要再起个.NET运行时?

    我不相信你会不清楚这点。原本一个最简单最正常不过的,连我这个.NET粉丝都会做出的决策,到你眼里又是个唱衰的理由了。C#的地位什么的都是你自己的想象而已,我丝毫不觉得有什么降低,原本它在做什么那还是在做什么。而且,地位这东西说到底就是虚无飘渺的东西,也就你这种技术评论员分析师什么的最关注这种,对这种无法证明也无法证否的东西,我毫不关心。

    再者,Windows Runtime说白了就是个Runtime,照你这么说,CLR从来就是C++写的,你之前怎么不强调高级.NET程序员的“资格”?WPF的精髓是XAML,MVVM这些,开发模式都在,代码都可用,在我看来就是完全兼容,换个命名空间换点类库算个屁啊。说到底,还是找尽各种理由来唱衰而已。我跟你不同,虽然动不动有人问我各种看法,我从来就表示不知道不清楚,哪像你知道点东西就能说出各种东西。

    最后,点评转Java实在不是个好例子,我知道的情况绝对比你具体的多,可惜别人的事情不好多说,而你又知道多少情况?看上去你发表各种意见的信心比我还足,完全就跟他们首席架构师一样。

    知道我为什么对你那么反感了吗?

  65. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-19 02:22:13

    你就没有想过WinRT是干什么的,用C++写WinRT太正常不过了,因为这是操作系统功能,当然用Native的,要知道它是需要给C#和C++还有JS调用的,怎么会用.NET写?难道用JS调用和用C++调用时WinRT接口时还需要再起个.NET运行时?

    当然不正常了,如果是这样的话,为什么不是先有c++的winrt,而是先有.net的wpf?js调用.net有什么问题,你应该知道silverlight第一代就是用js作为主要开发语言的,事实上,iron出来以后,微软还宣布过一个基于dlr的managed js的项目,现在显然改用native js了。

    winrt的推出,明显是基于.net的winfx失败了以后,微软不得不改用native c++重新开发的结果。

    微软原来的计划是用托管模型全面代替c++的api,所以vc的native功能最近几年发展非常缓慢

    WinFX 是 Windows Vista 的托管代码编程模型,它构建在 .NET Framework 的基础上并对其进行了扩展

    微软的WinFX已经把繁杂的Win32 API减少到8千个左右,在.NET框架下采用可管理代码编程模式,跟底层系统资源的关系更密切,能自动管理如内存等,减轻程序员的负担。另外,WinFX还加入全新的图形用户界面子系统Avalon、文件子系统WinFS和网络服务通讯子系统Indigo,使得开发环境更加友好。据Gartner预测,这些技术表明微软的API发生了巨大的改变,Win32 API终将被WinFX替代,而成为新操作系统中的遗产,正如Win32取代DOS和Win16一样。

    很显然,winrt的界面功能其实是与wpf(avalon)之类的重复的,为什么微软要用native C++重写一遍.net已经实现的功能,难道说wpf的架构无法升级改进为metro程序?

    我随便看了一下学习微软技术的网站

    WPF是Microsoft新一代开发技术,涵盖了桌面应用程序开发、网络应用程序开发和移动应用程序开发,是微软开发技术未来十年的主要方向。

    而现在使用native C++和js显然是微软未来的主流技术,wpf,silverlight在微软的地位明显在不断降低。

  66. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-19 02:32:54

    在2002年,微软还宣布他们的战略是api全部转移到托管代码中。

    Microsoft made it clear in 2002 with the announcement of the Longhorn API (LAPI) that their strategic direction was to move away from unmanaged code and instead provide a fully managed API for Windows client development.

    ,微软的visual c++团队还耐心解释过为什么wpf没有native c++的版本。 http://social.msdn.microsoft.com/forums/en-US/wpf/thread/dd1e31bb-feb4-4d77-b524-42a282f519b1/

    n a perfect world, it would be great to have both native and managed version of everything (well, in a really perfect world, there would be no hard distinction between using a native or managed API, but that's a different conversation ). However, the reality is that we have to balance the investment required to do this kind of thing versus the customer benefits realized by doing it. This cost/benefit analysis means that various teams will chose paths that they feel provides the maximal benefit for the cost. A result of this process is that today we find that some APIs/libraries are managed only (like WPF or WinForms), some native only (like the Vista shell or Win32), and only a handful are both (like DirectX).

    I can't speak for all Microsoft teams, but speaking from Visual C++ team's standpoint, we talked to a lot of customers about the very question of how important it was for them to do WPF in C++. We found that the overwhelming majority of customers were perfectly okay writing their WPF code in C# and creating an interop layer written in C++/CLI to hook this to their native C++ code. I don't want to completely discount that important minority of customers that would much prefer to do this work in native C++, but in terms of priority it was pretty clear to us that there were other places we could invest our resources that would provide greater benefit to a greater portion of our user base. To talk specifics, this decision freed up the resources necessary for us to invest in a substantial effort on our compiler front-end that will contribute to an amazing coding-time experience in the Visual Studio 10 timeframe.

    显然,微软现在用native c++重写界面框架,绝对不是他们原来计划中的事情,再结合silverlight地位不断下降的事实,很显然是全面调整了原来全面推广.net的战略。

    至于说你说的技术交流,我觉得一个基本问题,就是不能光低头拉车,还要抬头看路,一些要过时的技术有什么必要深入讲解?以前那些winform之类的文章再深入不过是浪费大家的时间而已。

    这也就是微软技术的通病,他非常易用,但是难以深入,也没必要深入,因为你深入以后微软很可能已经到了转换技术的时间了。

  67. 老赵
    admin
    链接

    老赵 2011-09-19 06:01:45

    @mcpssx

    我话都说到这份上了你还没听懂?再说一遍,我是程序员,别用你那产业分析师的眼光来跟我说有用没用过时不过时的。你这类分析师,只知道从“现象”作出推断,我一个人都能随随便便推断出正反两面结论。不过我自认不清楚“事实”,所以基本不会发表看法,也很反感随意发表观点的行为。

    想要兼听则明,给你指条路:出门右转Stack Overflow,Hacker News,Reddit讨论去,别在我这里呆着。我会去看那些东西了解点前沿消息,你上面的吹再多水我也懒得看,连格式都懒得帮你整理了。

  68. junxy
    220.168.63.*
    链接

    junxy 2011-09-22 02:04:36

    前两天在项目中我还碰到这个问题,还以为MVC3不支持这种model,看到这篇文章后都明白了。

    当时在stackoverflow找了个比较死的方法:返回一个List<dynamic>视图model,里面手动添加的一些ExpandoObject。。。

  69. zhuisha
    219.142.54.*
    链接

    zhuisha 2011-09-26 05:54:20

    @mcpssx

    你看了那么多的WinRT Session当真是勤奋,但是莫非你就没看见大多数Session的第一句介绍就是,这WinRT这玩意儿是用来替代Win32的,是Windows的另一个API,只不过吸收了.NET的思想,搞得面向对象了点,并且Win32仍然支持.实在搞不明白,你让WinRT跟.NET纠结啥呢?

    至于说你说的技术交流,我觉得一个基本问题,就是不能光低头拉车,还要抬头看路,一些要过时的技术有什么必要深入讲解?以前那些winform之类的文章再深入不过是浪费大家的时间而已。

    WinForm做企业开发没觉得有啥不爽啊,莫非你要做个进销存也用C++高来搞去?

  70. 链接

    韦恩卑鄙 @waynebaby 2011-09-28 03:27:58

    可乐死我了 哈哈哈 @mcpssx 看了那么多Build 的视频 没有注意到按照 Windows RT APP方式 不能运行在Desktop和网页中么? 这是一套平板触摸SDK拉 WPF和sl会一直活得很好的 哈哈哈

  71. 链接

    韦恩卑鄙 @waynebaby 2011-09-28 03:34:29

    老赵 这篇我来得比较晚

    用这个方法 在View里只能用 dynamic吧

    俺是非常懒的人,俺想问 有没有希望再进一步 在view<>里面直接使用这个匿名类型作为泛型参数 连智能提示都搞出来呢

    或者说 这是compile as service 的时候才有希望的事情了?>_<

  72. 老赵
    admin
    链接

    老赵 2011-09-28 05:05:05

    @韦恩卑鄙

    这个其实比较难吧,因为View自己又不知道自己的Model是谁提供的,View和Action又没法对应起来。以前有智能提示,是因为View已经标记了Model类型。

  73. xiangzhuyuan
    221.217.48.*
    链接

    xiangzhuyuan 2011-10-07 02:44:19

    看来老赵有点忙啊 !好久不更新!

  74. 链接

    韦恩卑鄙 @waynebaby 2011-10-08 10:06:16

    因为View自己又不知道自己的Model是谁提供的 的确是这样。

    其实我们一般情况下是不会让一个View接受多种类型的输出的 如果我们输出了 new{a=1,b=2} (类型 dasha) 我们其实是希望让View能够写到view中的

    可是匿名类型太过匿名了,我们没办法用 `a这样的命名,也无法指定 这是很麻烦的

    在这种状况下 与其说我们需要一个匿名类型 不如说我们更需要定义一个类似Tuple的 轻量级类型。

    如果支持这样的语法 return View( new {a=1,b=2} *nameas * Type1)

    我们就可以大大方方在View<>中写上 View了。

    这样的功能通过修改编译器应该是可以做到的,也许有更好的定义实现访法。

  75. 链接

    鬼域马 2011-10-10 01:19:36

    把老赵文章遍历一遍是个浩大的项目,看到我 内流满面

    说说想法,实践后,和大家分享其中的乐趣固然好,大没必要说服谁。 当然 心胸宽广 把博客当吵架 休闲 娱乐的好去处, 也没人能拦得住。

    ViewData["Title"] (asp.net mvc2.0) 和 ViewBag.Title (asp.net mvc3.0) 感觉用法上差不多,形式上嘛 嘿嘿。

    发觉到 Mono.Cecil 的修改IL的内容了

    但能修改什么, 怎么修改,那些是有意义的修改 有哪些副作用。这些内容好像是空白呀。

    这个可以有。但这个真没有。 :)

  76. bjbkp
    121.63.36.*
    链接

    bjbkp 2011-10-11 12:23:15

    老赵怎么好久不写文章了? 期待得很哪.....

  77. 链接

    Eric Poon 2011-10-23 11:04:35

    测试了,很好用,不过想要在FormModel中添加一个数据库的列表,然后在View中输出时,没有智能提示,字段多起来还是需要来回查看属性名字。

  78. 阿斯旺福
    110.103.77.*
    链接

    阿斯旺福 2011-10-24 01:50:26

    挺有意思的方法. 不过楼主的想法真诡异. 为啥不直接ViewBag.Title = title

  79. 老赵
    admin
    链接

    老赵 2011-10-24 11:51:46

    @阿斯旺福

    那么你试试看:

    ViewBag.Product = new { Title = "Hello World" };
    

    怎么最基本的举一反三都做不到呢?

  80. 老赵
    admin
    链接

    老赵 2011-10-24 11:52:35

    @鬼域马

    听不懂你在说什么,我觉得很多东西都是非常明显的,不用多说,你觉得还需要说什么呢?

  81. StrongBird
    168.159.144.*
    链接

    StrongBird 2011-10-25 09:24:29

    mcpssx兄貌似完全没有搞懂WinRT是怎么回事,推出的根本目的是什么。 WinRT基础类库是用C++写的,这和.NET是否该被摒弃或绕开有任何关系?小弟不才,但实在看不下去这种没有仔细去了解一项技术就开始乱喷的行径啊……

  82. 阿斯旺福
    110.103.77.*
    链接

    阿斯旺福 2011-10-26 01:00:45

    @老赵: 怎么最基本的举一反三都做不到呢?

    这个怎么了?

  83. 老赵
    admin
    链接

    老赵 2011-11-05 14:15:23

    @阿斯旺福

    自己试试看不就知道咯?

  84. 链接

    Leo 2011-11-14 01:47:35

    这个方法对业务变动比较多的很有用。语言神马的都是浮云,简化写代码的过程才是王道。

  85. 老赵
    admin
    链接

    老赵 2011-11-14 03:54:25

    @Leo

    所以我追求的是写代码的爽快成都嘛,活活。

  86. szq
    27.115.98.*
    链接

    szq 2011-12-16 02:05:36

    mcpssx低级人物

  87. 链接

    Gabriel Zhang 2012-01-10 04:16:07

    老赵,你好!我想请教几个关于部署Linux服务器上时Nginx的需要做哪些配置的问题,比如安全性上面的,我现在测试都只是简单的配置程序能够跑起来,如果发布到线上环境,要做其他的哪些配置?谢谢

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我