Nancy之基於Nancy.Hosting.Aspnet的小Demo

来源:http://www.cnblogs.com/catcher1994/archive/2016/01/20/5145173.html
-Advertisement-
Play Games

基於Nancy.Hosting.Aspnet的Nancy小Demo


近來學習了一下Nancy這個框架,感覺挺好用的,就寫篇簡單的文章記錄一下大致用法,由於是剛接觸,寫的代碼

可能不規範,也沒有具體的分層。。莫吐槽。。。

Nancy的官網:http://nancyfx.org/

GitHub地址:https://github.com/NancyFx/Nancy

Nancy在文檔的介紹 -- 輕量級

" Nancy is a lightweight, low-ceremony, framework for building HTTP based services on .NET and Mono. "

Nancy有多種Hosting:

  Hosting Nancy with ASP.NET
  Hosting Nancy with WCF
  Hosting Nancy with Azure
  Hosting Nancy with OWIN
            Web (Katana)
            Self Hosting
            Environment Variables
            Conditional Pass-through
  Hosting Nancy with Umbraco
  Hosting Nancy with Nginx on Ubuntu
  Hosting Nancy with FastCgi
  Self Hosting Nancy
  Implementing a Host
  Accessing the client certificate when using SSL

本文寫的Demo是基於Hosting Nancy with ASP.NET。

開發環境 :win 10 + VS2015 Community + SqlServer 2012

廢話不多說,開始正題:

 一、新建一個空的asp.net項目

建好之後空空如也

二、通過NuGet添加Nancy相關的Packages

    

主要是Nancy、Nancy.Hosting.Aspnet、Nancy.Viewengines.Razor這三個。其版本依次為1.4.3、1.4.1、1.4.3

我這裡選擇的視圖引擎是Razor,習慣了,你們可以選擇其他,這個問題不大。

三、更新一下Razor

預設安裝Nancy.Viewengines.Razor之後,它會安裝 Microsoft.AspNet.Razor.2.0.30506.0,我們用的是最新版的3.2.3

在NuGet通過已安裝的Packages來更新

到這裡,基本的工作已經OK了。

這裡用到了Dapper,所以我也添加了它的引用。

註:這裡是通過NuGet安裝的,所以它也在web.config里生成了一些配置。如果是手動添加引用的,註意要修改web.config。

四、加入css和javascript文件

允許我偷偷懶,這裡的我是直接copy一般新建mvc項目的,就連頁面佈局也是用的新建項目的模板。。

五、新建Moudles、Models、ViewModels、Views四個文件夾。

Modules-->相當於MVC中的Controllers文件夾

Models-->存放模型

ViewModels-->存放視圖模型

Views-->存放視圖

六、在Views下麵建一個佈局頁 _Layout.cshtml

就新建的mvc模板copy過來,稍加修改

 1 @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
 2 <!DOCTYPE html>
 3 <html>
 4 <head>
 5     <meta charset="utf-8" />
 6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7     <title>@ViewBag.Title - Catcher's NancyDemo</title>
 8     <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
 9     <link href="~/Content/Site.css" rel="stylesheet" />    
10     <link rel="shortcut icon" href="~/favicon.ico" />
11 </head>
12 <body>
13     <div class="navbar navbar-inverse navbar-fixed-top">
14         <div class="container">
15             <div class="navbar-header">
16                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
17                     <span class="icon-bar"></span>
18                     <span class="icon-bar"></span>
19                     <span class="icon-bar"></span>
20                 </button>
21                 <a href="/" class="navbar-brand">NancyDemo</a>
22             </div>
23             <div class="navbar-collapse collapse">
24                 <ul class="nav navbar-nav">
25                     <li><a href="/">首頁</a></li>
26                     <li><a href="/home/about">關於我們</a></li>
27                     <li><a href="/home/contact">聯繫我們</a></li>
28                     <li><a href="/movie/">電影</a></li>
29                     <li><a href="/movie-type/">類型</a></li>
30                 </ul>
31             </div>
32         </div>
33     </div>
34     <div class="container body-content">
35         @RenderBody()
36         <hr />
37         <footer>
38             <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
39         </footer>
40     </div>
41     <script src="~/Scripts/jquery-1.10.2.min.js"></script>
42     <script src="~/Scripts/bootstrap.min.js"></script>
43 </body>
44 </html>
_Layout.cshtml

七、在Modules下新建一個HomeModule.cs,具體如下:

 1 public class HomeModule : NancyModule
 2     {
 3         public HomeModule()
 4         {
 5             Get["/"] = _ => ShowHomePage();
 6             Get["/home/about"] = _ => ShowAboutPage();
 7             Get["/home/contact"] = _ => ShowContactPage();
 8         }
 9 
10         private dynamic ShowContactPage()
11         {
12             return View["Contact"];
13         }
14 
15         private dynamic ShowAboutPage()
16         {
17             return View["About"];
18         }
19 
20         private dynamic ShowHomePage()
21         {
22             return View["Index"];
23         }
24     }
HomeModule.cs

同時在Views文件夾下麵新建一個Home的子文件夾,在把mvc模板中的Index.cshtml,About.cshtml,Contact.cshtml

copy過來稍加修改

 1 @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
 2 @{
 3     ViewBag.Title = "首頁";
 4     Layout = "Views/_Layout.cshtml";
 5 }
 6 <div class="jumbotron">
 7     <h1>NancyDemo</h1>
 8     <p class="lead">Nancy is a lightweight, low-ceremony, framework for building HTTP based services on .NET and Mono. The goal of the framework is to stay out of the way as much as possible and provide a super-duper-happy-path to all interactions.</p>
 9     <p><a href="http://nancyfx.org/" class="btn btn-primary btn-lg">Learn more &raquo;</a></p>
10 </div>
Index.cshtml
1 @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
2 @{
3     ViewBag.Title = "About";
4     Layout = "Views/_Layout.cshtml";
5 }
6 <h2>@ViewBag.Title.</h2>
7 <p>Use this area to provide additional information.</p>
About.cshtml
 1 @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
 2 @{
 3     ViewBag.Title = "Contact";
 4     Layout = "Views/_Layout.cshtml";
 5 }
 6 <h2>@ViewBag.Title.</h2>
 7 
 8 <address>
 9     One Microsoft Way<br />
10     Redmond, WA 98052-6399<br />
11     <abbr title="Phone">P:</abbr>
12     425.555.0100
13 </address>
14 
15 <address>
16     <strong>Support:</strong>   <a href="mailto:[email protected]">[email protected]</a><br />
17     <strong>Marketing:</strong> <a href="mailto:[email protected]">[email protected]</a>
18 </address>
Contact.cshtml

然後F5,跑一下

     

已經能跑起來了。

下麵就是結合資料庫了。

八、在Models下麵建兩個類

 1 public class Movie
 2     {
 3         public int MovieId { get; set; }
 4 
 5         public string MovieName { get; set; }
 6 
 7         public int MovieTypeId { get; set; }
 8 
 9         public DateTime MovieAddTime { get; set; }
10 
11         public virtual MovieType MovieType { get; set; }
12 
13         public Movie()
14         {
15             MovieAddTime = DateTime.Now;
16         }
17     }
Movie.cs
 1     public class MovieType
 2     {
 3         public MovieType()
 4         {
 5             Movies = new HashSet<Movie>();
 6         }
 7 
 8 
 9         public int TypeId { get; set; }
10 
11         public string TypeName { get; set; }
12 
13         public virtual ICollection<Movie> Movies { get; set; }
14     }
MovieType.cs

以Movie表為例,繼續下麵的工作。

九、由於movie表中的數據展示,抽取出應該有的視圖模型

在ViewModels文件夾下麵建立MovieViewModel.cs、MovieListViewModel.cs

 1     public class MovieViewModel
 2     {
 3         public int MovieId { get; set; }
 4 
 5         public string MovieName { get; set; }
 6 
 7         public int MovieTypeId { get; set; }
 8 
 9         public string MovieTypeName { get; set; }
10 
11         public DateTime MovieAddTime { get; set; }
12     }
MovieViewModel.cs
1      public class MovieListViewModel
2     {
3         public IEnumerable<MovieViewModel> Movies { get; set; }
4     }
MovieListViewModel.cs

十、現在就該寫寫類似mvc控制器的東西了,在Modules文件夾下建立MovieModule.cs

把數據提取出來

 1     public class MovieModule : NancyModule
 2     {
 3         public MovieModule() : base("/movie")
 4         {
 5             Get["/"] = _ => ShowMovieIndexPage();            
 6         }
 7 
 8         private readonly string _sqlconnection =
 9                 "Data Source=192.168.0.71;Initial Catalog=NancyDemo;User Id=sa;Password=dream_time1314;";
10 
11         public SqlConnection OpenConnection()
12         {
13             SqlConnection connection = new SqlConnection(_sqlconnection);
14             connection.Open();
15             return connection;
16         }
17      
18         private dynamic ShowMovieIndexPage()
19         {
20             using (IDbConnection conn = OpenConnection())
21             {
22                 string getAllMoviesStoredProcedure = @"up_GetAllMovies";
23                 MovieListViewModel viewModel = new MovieListViewModel
24                 {
25                     Movies = conn.Query<MovieViewModel>(getAllMoviesStoredProcedure,
26                     null, null, true, null, CommandType.StoredProcedure)
27                 };
28                 return View["Index", viewModel];
29             }
30         }
31     }
MovieModule.cs

然後就去編寫視圖

 在Views下麵新建一個Movie文件夾,用於存放相關視圖

 1 @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<MovieDemo.ViewModels.MovieListViewModel>
 2 @{
 3     Layout = "Views/_Layout.cshtml";
 4     ViewBag.Title = "電影列表";
 5 }
 6 <a href="/movie/create">添加</a>
 7 <div>
 8     <table class="table">
 9         <tr>
10             <th>
11                 #
12             </th>
13             <th>
14                 電影名稱
15             </th>
16             <th>
17                 電影類型
18             </th>
19             <th>
20                 添加時間
21             </th>
22             <th></th>
23         </tr>
24         @foreach (var item in Model.Movies)
25             {
26             <tr>
27                 <td>
28                     @item.MovieId
29                 </td>
30                 <td>
31                     @item.MovieName
32                 </td>
33                 <td>
34                     @item.MovieTypeName
35                 </td>
36                 <td>
37                     @item.MovieAddTime
38                 </td>
39                 <td>
40                     <a href="/movie/edit/@item.MovieId">修改</a>
41                     <a class="delete" href="/movie/delete/@item.MovieId">刪除</a>
42                 </td>
43             </tr>
44         }
45     </table>
46 </div>
Index.cshtml

F5跑一下

OK!

然後就是修改某條數據,

在MovieModule.cs 的構造函數中添加 

1            Get["/edit/{movieId}"] = _ => ShowMovieEditPage(_.movieId);
2             Post["/edit/{movieId}"] = _ =>
3             {
4                 var movie = this.Bind<Movie>();
5                 return MovieEdit(movie);
6             };

然後添加ShowMovieEditPage和MovieEdit這兩個方法

 1 private dynamic ShowMovieEditPage(int movieId)
 2         {
 3             string getOneMovieStoredProcedure = @"up_GetMovieByMovieId";
 4             string getALLTypeStoredProcedure = @"up_GetAllMovieTypes";
 5             DynamicParameters dynamicParameters = new DynamicParameters();
 6             dynamicParameters.Add("@MovieId", movieId);
 7 
 8             using (IDbConnection conn = OpenConnection())
 9             {
10                 var movieViewModel = conn.Query<MovieViewModel>(getOneMovieStoredProcedure, dynamicParameters, null, true, null, CommandType.StoredProcedure).SingleOrDefault();
11                 ViewBag.typeList = conn.Query<MovieType>(getALLTypeStoredProcedure, null, null, true, null, CommandType.StoredProcedure);
12                 return View["Edit", movieViewModel];
13                 
14             }
15         }
ShowMovieEditPage
 1     private dynamic MovieEdit(Movie movie)
 2         {
 3             string updateMovieStoredProcedure = @"up_UpdateMovieByMovieId";
 4             DynamicParameters dynamicParameters = new DynamicParameters();
 5             dynamicParameters.Add("@MovieId", movie.MovieId);
 6             dynamicParameters.Add("@MovieName", movie.MovieName);
 7             dynamicParameters.Add("@MovieTypeId", movie.MovieTypeId);
 8 
 9             using (IDbConnection conn = OpenConnection())
10             {
11                 conn.Execute(updateMovieStoredProcedure, dynamicParameters, null, null, CommandType.StoredProcedure);
12                 return Response.AsRedirect("/movie");
13             }
14         }
MovieEdit

添加一個Movie的Edit視圖

 1 @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<MovieDemo.ViewModels.MovieViewModel>
 2 @{
 3     ViewBag.Title = "修改電影信息";
 4     Layout = "Views/_Layout.cshtml";
 5 }
 6 
 7 <form action="/movie/edit/@Model.MovieId" method="post">
 8     <div class="form-group">
 9         <label class="control-label col-md-2">電影名稱</label>
10         <div class="col-md-10">
11             <input type="text" class="form-control" id="MovieName" name="MovieName" value="@Model.MovieName" />
12         </div>
13     </div>
14     <div class="form-group">
15         <label class="control-label col-md-2">電影類型</label>
16         <div class="col-md-10">
17             <select id="MovieTypeId" name="MovieTypeId" class="form-control">
18                 @foreach (var item in (System.Collections.Generic.List<MovieDemo.Models.MovieType>)ViewBag.typeList)
19                 {
20                     if (Model.MovieTypeId == item.TypeId)
21                     {
22                         <option selected="selected" value="@item.TypeId">@item.TypeName</option>
23                     }
24                     else
25                     {
26                         <option value="@item.TypeId">@item.TypeName</option>
27                     }
28                 }
29 
30             </select>
31         </div>
32     </div>
33     <div class="form-group">
34         <div class="col-md-offset-2 col-md-10">
35             <input type="submit" value="修改" class="btn btn-default" />
36         </div>
37     </div>
38 </form>
Edit.cshtml

然後即可跑起來了。

其中用到了一個模型綁定,需要添加Nancy.ModelBinding引用,有了這個綁定,省了很多事!!

 var movie = this.Bind<Movie>();

同理,增加和刪除也是同樣的做法,下麵是MovieModule.cs的完整代碼

  1 using MovieDemo.Models;
  2 using MovieDemo.ViewModels;
  3 using Dapper;
  4 using Nancy;
  5 using Nancy.ModelBinding;
  6 using System.Data;
  7 using System.Data.SqlClient;
  8 using System.Linq;
  9 
 10 namespace MovieDemo.Modules
 11 {
 12     public class MovieModule : NancyModule
 13     {
 14         public MovieModule() : base("/movie")
 15         {

              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 又發現了一個 .net 的 bug!最近在使用正則表達式的時候發現:在忽略大小寫的時候,匹配值從 0xff 到 0xffff 之間的所有字元,正則表達式竟然也能匹配兩個 ASCII 字元:i(code: 0x69) 和 I(code: 0x49);但是仍然不能匹配其他的 ASCII 字母和數字。 ....
  • 來源:http://zxlovenet.cnblogs.com在許可權分配中有多個許可權級別,不同用戶分別有多個不同的許可權。論壇的許可權:查看、發帖、投票、搜索用戶的許可權:用戶A:查看、發帖用戶B:查看用戶C:查看、發帖、投票、搜索分析:有四種不同的許可權級別,總共2^4種許可權分配方式。像這樣許可權等級劃分和...
  • 觸發器現有字典表(Dict)欄位說明Id標示ItemKey鍵ItemValue值UpperId上層標示需求一:當新增一條記錄的時候,若已存在相同鍵的,拒絕插入//操作步驟:展開相關表,右擊‘觸發器’,新建即可USE [sqlffwj]GOSET ANSI_NULLS ONGOSET QUOTED_I...
  • 1、查找空節點//*[not(text())] 表示內容為空的節點//*[count(*)=0] 表示沒有子節點的節點"//*[count(*)=0 and not(text())]" 空節點,表示既沒有內容,也沒有子節點,但未排除包含屬性的節點
  • 反射可以動態獲取數據的類型,Type 類可以獲取其中的 欄位、方法、屬性等。尤其是將欄位與屬性做區分可以讓我們可以獲取,自己想獲得的。廢話不多說上代碼。先將數據導入的類,寫下: 1 using System; 2 using UnityEngine; 3 4 namespace ARPGSimpl....
  • 10-3. 返回結果是一個標量值問題想取得存儲過程返回的一個標量值.解決方案假設我們有如Figure 10-2所示的ATM機和ATM機取款記錄的模型Figure 10-2. 一個ATM機和ATM機取款記錄的模型我們想要用一個存儲過程在指定機器和日期內返回所有的取款總額Listing 10-9 是這個...
  • 【工具】-【選項】-【環境】-【區域設置】-【語言】-【獲取其他語言】 安裝後重啟即可。
  • Autofac是傳說中速度最快的一套.NET高效的依賴註入框架。Autofac的介紹與使用請去參考Autofac全面解析系列(版本:3.5)。這裡介紹的已經挺詳細的啦。 下麵我就先來說說MVC4中使用Autofac吧,至於工廠模式與依賴註入的區別的話,這個我簡單的解釋一下,也只是我的個人觀點。使.....
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...