2016年,.net 会有很多大更新 ASP.NET 5

在此之前我都是用着古老的.net做开发的 (WebForm + IIS)

为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC Owin 等等.

接下来我会针对主题写一些学习笔记.

Setup startup Owin + MVC + WebApi

1.New empty project and add folders and code references for "MVC, WebApi".

 注: Empty project 就是什么sample都不要有的, add folders and code references 就是要包括 dll , 这里的 MVC 和 WebApi 都是没有包含Owin概念的,我们需要之后自己加入哦。

2.Install "Microsoft.Owin.Host.SystemWeb" (This is for host in IIS)

3.Install "Microsoft.AspNet.WebApi.Owin" (WebApi for OWIN)

3.Add a Startup.cs file with below code

using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;
using Microsoft.Owin;
using Owin; [assembly: OwinStartupAttribute(typeof(Project.Startup))]
namespace Project
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
//MVC
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes); //WebApi
var httpConfig = new HttpConfiguration();
WebApiConfig.Register(httpConfig);
app.UseWebApi(httpConfig);
}
}
}

4.Remove Global.asax

 Startup.cs 就是for Owin 的,我们不再使用 IIS 的 Global.asax 了.

Sample MVC (Model, View and Controller)

微软有一些folders的的结构,我们可以参考 follow

Model,View,Controller 各一个folder

View/Shared 放一些sharing的view

View/Shared/_Layout.cshtml 布局

View/_ViewStart.cshtml 每一个view的初始化

Example for _ViewStart.cshtml

@{
Layout = "~/Views/Shared/_Layout.cshtml"; //每一个View 都是用 _Layout.cshtml 布局, 这个是可以被overwrite掉了.
}

Example for _Layout.cshtml

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" /> @*可以直接用 "~/"*@
@RenderSection("css", required: false) @*RenderSection 可以在子 View 填入内容*@
</head>
<body>
@RenderBody() @*这个个子 View 内容*@
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
@RenderSection("script", required: false)
</body>
</html>

Controller, Model 与 View 之间的沟通

Example Controller

using System.Collections.Generic;
using System;
using System.Web.Mvc;
using Project.Models;
using System.Threading.Tasks; namespace Project.Controllers
{
[RoutePrefix("")]
public class HomeController : AsyncController //Async 可以for EF await
{
[Route("", Name = "Home")]
public async Task<ActionResult> Index(string param)
{
ViewData["attr"] = "value"; //passing value by 字典
ViewBag.attr = "value"; // passing value by dynamic
ViewBag.listStr = new List<string> { "a", "b", "c" };
HomeViewModels homeVM = new HomeViewModels //passing value by ViewModel
{
content = "strContent",
headerViewModels = new HeaderViewModels
{
content = "headerContent"
}
};
return View(homeVM);
}
}
}

Example Model

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Project.Models
{
public class HomeViewModels
{
public string content { get; set; }
public HeaderViewModels headerViewModels { get; set; }
} public class HeaderViewModels
{
public string content { get; set; }
}
}

如果多的话,可以一个ViewModels 一个 file

Example View

@*初始化*@
@{
ViewBag.title = "Home";
Layout = "~/Views/Shared/_Layout.cshtml";
} @*setup _Layout.cshtml 的 RenderSection*@
@section css {
<link href="~/Content/Site.css" rel="stylesheet" />
}
@section script {
<script src="~/Scripts/jquery.validate.js"></script>
} @*setup ViewModels*@
@model Project.Models.HomeViewModels <div>
<p>Home</p>
@*渲染一个 partial view*@
@Html.Partial("~/Views/Shared/PartialView/header.cshtml", @Model.headerViewModels); <br />
<p>passing value by 字典 : @ViewData["attr"]</p>
<p>passing value by dynamic : @ViewBag.attr</p> @*looping*@
@foreach (string str in ViewBag.listStr)
{
<p>@str</p>
}
@for (int i = ; i < ViewBag.listStr.Count; i++)
{
<p>@i</p>
} @*create Link*@
<a href="@Url.RouteUrl("Home",new { param = "param" })">Home</a>
<br />
@Html.ActionLink("Home", "Index", "Home", new { param = "param" }, null)
</div>

题外话 :

关于 App_Code

以前我是用 website 而不是 project 来开发的,这2者对 App_Code 有点区别

在 project App_Code 创建好 .cs 文件之后,要把属性 -> Build Action 设置成 Compile

关于 SSL

设置成 SSL, 去project 的属性 -> SSL Enabled = true, 然后 right click -> 属性 -> Web -> 把 project url 换成 SSL 的路径

WebApi + AngularJS

如果要使用 OData filter 的话,应该是要装 Microsoft.AspNet.WebApi.OData

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http; namespace Project.WebApiControllers
{
[RoutePrefix("api/products")]
public class ProductsController : ApiController
{
[Route("")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
}
@{
Layout = null;
} <!DOCTYPE html>
<html ng-app="app" ng-controller="ctrl">
<head>
<meta name="viewport" content="width=device-width" />
<title>Products</title>
</head>
<body>
<script src="~/Scripts/jquery-2.2.0.min.js"></script>
<script src="~/Scripts/angular.min.js"></script>
<script>
var app = angular.module("app", []);
app.controller("ctrl", function ($http) {
$http({
url: "https://localhost:44300/api/products",
method: "GET"
}).then(function (response) {
console.log(response);
});
});
</script>
</body>
</html>

WebApi + OData v4

Install "Microsoft.AspNet.OData"

change WebApiConfig to

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.OData.Batch;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;
using Microsoft.OData.Edm;
using Project.Entity; namespace Project
{
public static class WebApiConfig
{
private static IEdmModel GetEdmModel()
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "Project";
builder.ContainerName = "ProjectContainer";
//每一个Entity都要注册到EDM
//注意 : 下面这个 "products" 是url prefix, e.g. api/products... 而且OData url 是区分大小写的哦
builder.EntitySet<Product>("products");
return builder.GetEdmModel();
} public static void Register(HttpConfiguration config)
{
// Web API configuration and services // Web API routes
config.MapHttpAttributeRoutes(); //config.Routes.MapHttpRoute(
// name: "DefaultApi",
// routeTemplate: "api/{controller}/{id}",
// defaults: new { id = RouteParameter.Optional }
//); //"api" 是 url prefix
config.MapODataServiceRoute("OData", "api", GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
config.EnsureInitialized();
}
}
}

change WebApiController to

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.OData;
using System.Web.OData.Routing;
using Project.Entity; namespace Project.WebApiControllers
{
[ODataRoutePrefix("products")] //这个"products"要对应注册EDM的值哦 , e.g. builder.EntitySet<Product>("products")
public class ProductsController : ODataController
{
[ODataRoute("")]
public IHttpActionResult Get()
{
return Ok(new List<Product> { new Product { id = , code = "code" } });
}
}
}

Web.config 要放 ExtensionlessUrlHandler 主要是为了处理 url 的 "."

这里我用的和微软官网有点不同,因为微软的放了,static file 会出现500 error

refer : http://blogs.msdn.com/b/davidhardin/archive/2015/01/13/odata-action-gets-404-due-to-periods-in-url.aspx

<configuration>
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="/api/*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</configuration>

Install EntityFramework

在 WebConfig 加入

<configuration>
<connectionStrings>
<add name="DefaultConnection" connectionString="data source=192.168.1.95;Network Library=DBMSSOCN;initial catalog=HotelPlatform;persist security info=True;user id=keatkeat;password=001001;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>

data source = IP

catalog= Database Name

password = 需要encode for xml

删除掉

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>

identity + oauth 2.0 待续

Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记的更多相关文章

  1. Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记之"坑"

    1.AngularJS route 与 MVC route http://www.cnblogs.com/usea/p/4211989.html public class SingleRoute : ...

  2. 体验Visual Studio 2015 之 MVC - 视图组建

    VS2015 PERVIEW中可以创建MVC 项目. 我们可以 发现有几大亮点. 首先我们看目录结构: 当前项目包含两个主要的文件夹:Solution Items .src 很明显src文件夹下为当前 ...

  3. Visual Studio 2015 新建MVC项目 Package Manager Console不能使用 (HRESULT: 0x80131500)

    Visual studio 2015 突然新建不了MVC项目,报出错误: HRESULT: 0x80131500 在折腾了很长时间,最后在Github上看到这样一个贴 地址:https://githu ...

  4. visual studio 2015中的webapi生成helpPage,页面不显示方法说明问题解决

    环境: vs2015.win7 参考:http://www.cnblogs.com/Erik_Xu/p/5638381.html 生成的help页面如下:,并没有显示控制器和方法. 原因是:新建项目时 ...

  5. 升级 Visual Studio 2015 CTP 5 的坑、坑、坑

    前两天,微软发布了 Visual Studio 2015 CTP 5,全称为 Visual Studio 2015 Community Technology Preview 5,意为社区技术预览版,之 ...

  6. visual studio 2015 搭建python开发环境,python入门到精通[三]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...

  7. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...

  8. Visual Studio 2015创建ASP.NET MVC流程

    本文链接:https://blog.csdn.net/begindong/article/details/68059437本人这两天第一次对c#进行系统学习,写出来做个学习记录和大家分享,以下有什么错 ...

  9. Visual Studio 2015打开ASP.NET MVC的View提示"Object reference not set to an instance of an object"错误的解决方案

    使用Visual Studio 2013打开没有问题,但Visual Studio 2015打开cshtml就会提示"Object reference not set to an insta ...

随机推荐

  1. P - 奔小康赚大钱 - hdu 2255(带权值的匹配)

    分析:这是一个KM的模板题,也就不多说了,KM最复杂的情况都能过,下面是没有优化过的代码: ****************************************************** ...

  2. 判断一个js对象,是否具有某个属性

    一个对象,想必我们关注的最多的应该是它上面的属性有哪些吧.那么,怎么判断一个对象是否具有某个属性呢? /*下面是一个对比,看看在判断是否包括一个键上面,Object结构和Set结构的写法不同.*/ / ...

  3. Swift optional详解

    学习了一阵swift对于optional类型一直不是很了解,为此特意学习了一下,通过观看斯坦福大学的视频,将他所讲的进行了总结 optional 有两个值 1.not set (未设) 代表这个值没有 ...

  4. Unity3D NGUI制作的Button放到场景中,按钮从2D变到3D

    通常我们使用Button都是在UI界面,即NGUI的摄像机下,如果想换到场景中,即不让按钮以UI形式显现,而是和场景中的物体一起随着摄像机移动而缩小,放大. 很简单,把Button从NGUi的摄像机中 ...

  5. POJ 1458-Common Subsequence(线性dp/LCS)

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39009   Accepted: 15 ...

  6. php编译错误Note that the MySQL client library is not bundled anymore或者cannot find mysql header file

    rpm -ivh MySQL-devel-community-5.1.57-1.sles10.x86_64.rpm export PATH=/usr/local/services/libxml2-2. ...

  7. Java基础知识强化69:基本类型包装类之Character案例(统计字符串中大写小写以及数字的次数)

    我们直接看案例如下: package cn.itcast_03; import java.util.Scanner; /* * 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数.(不考虑 ...

  8. Lombok介绍及使用方法

    lombok简介 lombok是暑假来到公司实习的时候发现的一个非常好用的小工具,刚见到的时候就感觉非常惊艳,有一种相见恨晚的感觉,用了一段时间之后感觉的确挺不错,所以特此来推荐一下. lombok的 ...

  9. hibernate01ORM的引入

    /**01.之前的方式 在while()中书写的 * int id = rs.getInt("gradeid"); String gradeName = rs.getString( ...

  10. LINQ Enumerable

    System.Linq.Enumerable类,提供了数十种称为扩展方法的共享方法,帮助您操作所有实现IEnumerable(of T)接口的类中的数据.由于Enumerable类的扩展方法可以处理许 ...