2014年3月17日星期一

我对.NET平台下开发语言C#的理解. - just coding

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
我对.NET平台下开发语言C#的理解. - just coding  阅读原文»

参加工作已经满一年了.

发现在工作中大多数做的都是CURD.

一个项目就 一个Model层,一个DAL层,一个BLL层.在加一个ADO.NET SQLHERLPER.

很长时间没有像以前刚学软件开发时的那种冲劲和钻进了.

感觉工作好像仅仅只是一个熟悉的工程,就想一个泥瓦工一样.学的时候,可能需要学会各种贴砖手法.

但真到工地上了,用到了可能只有仅仅的其中一两种.

但不管是用泥瓦工贴砖,还是代码民工码代码.

基本功力还是得必须掌握的.

下面我就写一下,我自己一年来对.NET开发语言C#的理解.

开发语言,在我的印象中,好像最重要的两个东西就是:"变量和函数".

变量是一个容器,用于存储数据,变量有类型.不同的容器存储的数据也不一样.

函数是一个可重复使用的代码段(有很多课外书对函数的定义十分高神和神秘,让人摸不着头脑).

不过对于像c这种面相过程的语言来说,理解函数起来可能更加简单.

.NET作为第四代(第一代:机器语言;第二代:汇编语言;第三代:面相过程;第四代:面相对象)高级语言的开发平台.所以一下把变量和函数的"种类"变的多了起来.

在.NET中,函数分 实例函数,静态函数,虚函数,构造函数,析构函数等.

变量分:静态变量,实例变量,常量变量,只读变量等.

因为.NET中存在类这样一个概念(类就是一个引用类型的数据结构)

我在这更希望把.NET中(特别指C#开发语言)中的变量,就分为两种:

全局变量和局部变量.

全部变量就是类的字段,这里包括静态字段和实例字段.

局部变量,就是申明在函数内部或者函数参数的变量.你无法将函数的参数和函数的内部变量申明成静态的.

因为函数的调用是基于堆栈的.在调用完毕之后会消除对内存的占用.

他们之前的最主要的区别之一:全局变量(静态和实例),你不去初始化它也没关系..NET平台会默认的去初始化它.(值类型 0 引用类型 null 布尔类型 false),起码在编译阶段,这些全局变量,你不去管它,它也不会报错.

局部变量则必须要满足,申明,赋值,在使用的原则,如果三者缺一,则编译都不通过.局部变量,必须由我们coder全程把控.

在说函数.

在C#中,函数分实例函数和静态函数.

但我觉得这是一种特别书面的叫法.

因为在我的理解中,函数无非就是一段可重复调用的代码.

在.NET Runtime看来,函数其实挺简单的.

但为什么C#里为什么要分实例函数和静态函数呢?

我觉得是调用方式的问题.

通常,实例函数的调用都是 obj.Method(); //

在定义实例函数的时候,我们通常可以在函数体内书写 this关键字,this关键字代表的是当前类的实例本身(和函数一点关系都没有).

所以,我在这得出的结论就是,实例函数和静态函数没本质区别,唯一的区别就是 实例函数比静态函数要多一个参数,这个参数就是当前对象this本身.

所以上面的实例函数调用代码,实际上在.NET Runtime看来,调用形式应该是这样的 Method(obj);

所以实例函数是一段可重复使用的代码,在使用上有一点小限制(或者默认的行为),函数必须带一个参数,这个函数就当定义这个函数对象类的实例.

.NET 4.0 加入的扩展函数也可以证明我上面的观点.

因为扩展函数的本质,就是一个静态函数,将需要扩展方法的对象作为这个静态函数的第一个参数传递进去了而已.

而静态函数则更为单纯,它就是一段可重复使用的代码.程序员可以完全决定此段代码需要哪些初始化参数.仅此而已.

所以,我最后的结论是:

变量就两种:局部和全局 . 局部,由coder全程把控. 全局..NET runtime会帮我们多做一步初始化的操作.

函数就一种:就是一段可重复执行的代码. 唯一区别,实例函数需要默认带一个参数,而静态函数则不需要.

小弟第一次在博客园上发表自己的观点,很多地方写的都不完整和严谨,也不懂怎么排版.

希望大家见谅.


本文链接:http://www.cnblogs.com/JustCoding/p/3607304.html,转载请注明。

ASP.NET MVC 在控制器中获取某个视图动态的HTML代码 - szyuxueliang  阅读原文»

如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中,然后通过代码传入model,动态获取cshtml中的HTML代码

当然,我们想要使用通用的方法去获取cshtml,就必须重写RazorViewEngine视图引擎,配置视图搜索位置

在查找一个视图时,Razor视图引擎遵循了MVC框架早期版本建立起来的约定。例如,如果你请求与Home控制器相关的Index视图,Razor会审查这样的视图列表:

~/Views/Home/Index.cshtml
● ~/Views/Home/Index.vbhtml
● ~/Views/Shared/Index.cshtml
● ~/Views/Shared/Index.vbhtml

正如你现在知道的,Razor实际上不会在磁盘上查找这些视图文件,因为它们还没有被编译成C#类。Razor查找的是表示这些视图的编译类。.cshtml文件是含有C#语句的模板(我们正在使用的这种),而.vbhtml文件含有Visual Basic语句。

你可以通过生成一个RazorViewEngine子类,来改变Razor搜索的这种视图文件。这个类是Razor的IViewEngine实现。它建立于一组基类之上,这些类定义一组用来确定搜索哪种视图文件的属性。这些属性如表所描述。

Property
属性
Description
描述
Default Value
默认值
ViewLocationFormats
MasterLocationFormats
PartialViewLocationFormats
The locations to look for views, partial views, and layouts
查找视图、分部视图、以及布局的位置
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml"
AreaViewLocationFormats
AreaMasterLocationFormats
AreaPartialViewLocationFormats
The locations to look for views, partial views, and layouts for an area
查找一个区域的视图、分部视图、及布局的位置
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.vbhtml"

这些属性先于Razor的引入,这是每组三个属性具有相同值的原因。每个属性是一个字符串数组,它们是用复合字符串格式化符号来表示的。以下是与占位符对应的参数值:
● {0} represents the name of the view.
{0} 表示视图名
● {1} represents the name of the controller.
{1} 表示控制器名
● {2} represents the name of the area.
{2} 表示区域名
为了修改搜索位置,你要生成一个派生于RazorViewEngine的新类,并修改表所描述的一个或多个属性值。

在Infrastructure文件夹中新建一个CustomRazorViewEngine类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Infrastructure
{
public class CustomRazorViewEngine : RazorViewEngine
{
public CustomRazorViewEngine()
{

ViewLocationFormats
= new string[] {

"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared_PartialView/{0}.cshtml"//指定查找某个文件的路径
};

PartialViewLocationFormats
= new string[] {

"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared_PartialView/{0}.cshtml"////指定查找某个文件的路径
};
}

}
}

我们在Global.asax的Application_Start方法中,用ViewEngines.Engines集合来注册我们的这个派生视图引擎,像这样:

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ViewEngines.Engines.Clear();

ViewEngines.Engines.Add(
new CustomRazorViewEngine());


WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}

获取html字符串的方法以及如何调用

public class HomeController : Controller
{
//
// GET: /Home/


public ActionResult Index()
{
string html = this.ControllerContext.RenderViewToString("_CommonPartial", new UserViewModel() { UserName="haha"});
return View(new UserViewModel() { IsEnable = false, UserCode = "aa" });
}







}

public static class HelperExtensions
{
public static string RenderViewToString(this ControllerContext context, string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName
= context.RouteData.GetRequiredString("action");

context.Controller.ViewData.Model
= model;

using (var sw = new StringWriter())
{
ViewEngineResult viewResult
= ViewEngines.Engines.FindPartialView(context, viewName)

阅读更多内容

没有评论:

发表评论