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 API2 设计 RESTful API

Copyright @ DocsASP.NETASP.NET Web API

微软的官方文档

首先是新建ASP.NET api项目

然后是设计Model

Product.cs

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

namespace WAPI.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

编写Controller(路由)

ProductsController.cs

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

using WAPI.Models;

namespace WAPI.Controllers
{
    public class ProductsController : ApiController
    {
        // XXM => decimal类型小数
        Product[] products = new Product[]{
            new Product{ Id=1,Name="Tomato Soup",Category="Groceries",Price=1},
            new Product{ Id=2,Name="Yo-yo",Category="Toys",Price=3.75M},
            new Product{ Id=3,Name="Hammer",Category="Hardware",Price=16.99M}
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public IHttpActionResult GetProduct(int id)
        {
            //容器.FirstOrDefault(Boolean) 返回满足条件的第一个元素,如未找到,返回默认值
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                //ApiController.NotFound()
                //即404界面
                return NotFound();
            }
            //正常返回
            return Ok(product);
        }
    }
}

最后通过编写前端界面,并使用JQuery来实现ajax传输,显示

index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Product App</title>
</head>
<body>
    <div>
        <h2>All Products</h2>
        <ul id="products"/>
    </div>
    <div>
        <h2>Search by ID</h2>
        <input type="text" id="prodId" size="5"/>
        <input type="button" value="Search" onclick="find();"/>
        <p id="product"/>
    </div>

    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
    <script>
        var uri = 'api/products';

        (document).ready(function () {             //Send an AJAX request             .getJSON(uri)
                .done(function (data) {
                    //On success,'data' contains a list of products.
                    .each(data, function (key, item) {                         //Add a list item for the product。                         ('<li>', { text: formatItem(item) }).appendTo(('#products'));                     });                 });         });           function formatItem(item) {             return item.Name + ': ' + item.Price;
        }

        function find() {
            var id = ('#prodId').val();             .getJSON(uri + '/' + id)
                .done(function (data) {
                    ('#product').text(formatItem(data));                 })                 .fail(function (jqXHR, textStatus, err) {                     ('#product').text('Error: ' + err);
                });
        }
    </script>
</body>
</html>

结果如下所示

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表达式