DotNet

SQL:
工厂模式创建DbCommand
    /// <summary>
    /// 创建新的连接对象
    /// </summary>
    /// <returns></returns>
    public static DbCommand CreateCommand()
    {
        string dataProviderName = BalloonShopConfiguration.DbProviderName;
        string connectionString = BalloonShopConfiguration.DbConnectionString;
        ///工厂模式下新建名字为dataProviderName的连接
        DbProviderFactory factory = DbProviderFactories.GetFactory(dataProviderName);
        DbConnection conn = factory.CreateConnection();
        ///项数据工厂设置连接字符串
        conn.ConnectionString = connectionString;
        ///创建特定于某数据库的command对象
        DbCommand comm = conn.CreateCommand();
        comm.CommandType = CommandType.StoredProcedure;
        return comm;
    }

执行查询:
    /// <summary>
    /// 执行查询语句
    /// </summary>
    /// <param name="command"></param>
    /// <returns></returns>
    public static DataTable ExecuteSelectCommand(DbCommand command)
    {
        ///将返回的Datatable
        DataTable table;
        try
        {
            //执行该命令
            command.Connection.Open();
            DbDataReader dr = command.ExecuteReader();
            table = new DataTable();
            table.Load(dr);
            dr.Close();
        }
        catch (Exception e)
        {
            Utilities.LogError(e);
            throw;
        }
        finally
        {
            command.Connection.Close();
        }
        return table;
    }

返回Datatable是因为可以使用更少的时间

ASP.NET MVC 搭建博客 Song Of The Sea

第五个博客上线了!

这次使用的是ASP.NET MVC + Bootstrap3 + SignalR + 百度地图api + ajax无刷新更新页面等等….

目标: Demo : http://hsdog.be-sunshine.cn

ASP搭建的一个博客(部分重构之前python写的博客,大部分新添加的内容):一只划水狗

但本网站仅供交流和娱乐学习用,因为没有对标签进行处理,所以很容易就会被攻陷的.回头有空了在添加标签过滤功能.

🙂

代码等回头有空的时候放上来~

预览:



ASP.NET MVC Filter 登录限制-类Python装饰器

想必学过Flask编写Web服务端的都对 @login_required 很熟悉吧,一个语句决定了访问者是否有权限访问当前页面.

那么疑问来了,ASP.NET MVC中是否有类似于Python装饰器一类的语法呢?

答案是有的,如果仅仅是权限以及登录确认的判断的话,ASP.NET MVC 有一个 AuthorizeAttribute 类,这个类的结构以及用法可以替代 @login_required,接下来编写实现代码.

首先新建一个ASP.NET MVC 项目,新建一个Filter文件夹,该文件夹下存放网站允许访问一类的类.

新建MyAuthorizeAttribute类,继承AuthorizeAttribute 类,重写AuthorizeCore和HandleUnauthorizedRequest方法.

第一个方法是授权检察,第二个方法是权限判断失败时执行的操作.

接下来实现当时间分钟是偶数时允许登录.

//MyAuthorizeAttribute.cs

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

namespace WebApplication3.Filter
{
    public class MyAuthorizeAttribute :AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return DateTime.Now.Minute % 2 == 0;  
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.HttpContext.Response.Redirect("/Home/ShowTip");

            //base.HandleUnauthorizedRequest(filterContext);  
        }  
    }
}
//HomeController.cs

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

namespace WebApplication3.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [MyAuthorizeAttribute]
        public ActionResult ShowDetails2()
        {
            return View();
        }
        public ActionResult ShowTip()
        {
            return View();
        }  
    }
}

ASP.NET API2 设计 RESTful API 服务端解决跨域

原理:

只需要在消息头中添加一句:
Access-Control-Allow-Origin *

即可.

解决方案是直接在nuget中安装 Microsoft Asp.Net Web Api 2.2 Cross-Origin

然后在App-Start/WebApiConfig.cs下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Cors;

namespace WAPI
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            //跨域配置
            config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

即可.

ASP.Net 记录贴

委派:
委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

1.委托类型的定义
委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

delegate void MyDel(int x);

委托类型声明:

(1) 以deleagate关键字开头。

(2)返回类型+委托类型名+参数列表。

2.声明委托变量

MyDel del1,del2;

3.初始化委托变量

del1 = new MyDel( myInstObj.MyM1 );
del2 = new MyDel( SClass.OtherM2 );

4.组合委托
委托可以使用额外的运算符来组合。这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。

委托是恒定的,操作数委托创建后不会被改变。委托组合拷贝的是操作数的副本。

MyDel del1 = myObj.MyMethod;
MyDel del2 = SClass.OtherM2;
MyDel del3 = del1 + del2;   //组合调用列表

5.委托加减运算

可以使用+=运算符,为委托新增方法。

同样可以使用-=运算符,为委托移除方法。

MyDel del = myObj.MyMethod;
del += SClass.OtherM2; // 增加方法
del -= myObj.MyMethod; // 移除方法

6.委托调用
委托调用跟方法调用类似。委托调用后,调用列表的每个方法将会被执行。

在调用委托前,应判断委托是否为空。调用空委托会抛出异常。

if(null != del)
{
     del();//委托调用
}

7.匿名方法
匿名方法是在初始化委托时内联声明的方法。

基本结构:

deleage( 参数 ) { 语句块 }

例如:

delegate int MyDel (int x); //定义一个委托 

MyDel del = delegate( int x){ return x; };

8.Lambda表达式
Lambda运算符读作”goes to”。

MyDel del = delegate( int x) { return x; };//匿名方法
MyDel del2 = (int x) => {return x;};//Lambda表达式
MyDel del3 = x => {return x};//简写的Lambda表达式