Your First ASP.NET 5 Web App Using Visual Studio

            本人英语翻译能力有限,欢迎各位大神指正,谢谢!

                                                    Your First ASP.NET 5 Web App Using Visual Studio

             在本教程中,您将用ASP.NET 5创建一个简单的Web应用程序.并通过实体框架(EF)SQL 数据库中存储数据,用ASP.NET MVC支持基本的CRUD(增删改查)操作.

             In this article(文章章节):

    Prerequisites(前期准备)

           在您开始项目之前,请确保你已经根据开始步骤在Windows上安装好ASP.NET 5.在这个教程中假设您已经安装好VS2015和最新版本的ASP.NET 5及其工具。

  Create a new ASP.NET 5 project(创建一个新的ASP.NET 5项目)

               启动Visual Studio 2015,点击File菜单,选择New>Project

            在Installed>Templates> Visual C# > Web下,选择ASP.NET Web Application项目模板,将项目命名为ContosoBooks,然后点击OK

         

        在 New ASP.NET Project(新建ASP.NET项目)对话框中,选择ASP.NET 5 Preview Templates(ASP.NET 5 预览模板)下的Web Application(Web 应用程序),并确定没有选择Host in the cloud(在云中托管),点击OK.

             

   Running the default app(运行默认的应用程序)

           一旦Visual Studio完成创建的应用程序,通过选择Debug(调试)->Start Debugging(开始调试)来运行应用程序,或者是按F5运行程序。

             可能会花一些时间去初始化Visual Studio和新的应用程序,一旦完成,应用程序将会运行在浏览器上。

          

           看完正在运行的应用程序后,关闭浏览器并点击VS工具栏中的”Stop Debugging”(停止调试)图标,停止应用程序。

   Review the project(查看项目)

             Visual  Studio的解决方案管理器窗口允许您管理这个项目的文件。您刚创建的Web应用程序模板中添加如下基本文件夹结构:

                

                 Visual Studio 为您的项目创建一些最始文件夹和文件,您应该熟悉的主要文件如下所示:

File Name  

  文件名称

Purpose        用途

project.json 一个project.json文件定义了.NET运行环境,它包含DNX运行和项目打包的所有信息。包括project.json文件结构的更多详情,请看Working with DNX Projects
 global.json Visual Studio 用这个文件配置项目。

appsettings.json 

这个文件允许您添加更多的项目信息,比如:链接字符串的值。更多的信息,请看

Configuration(后面有,2.48)

Startup.cs Startup类为应用程序提供了一个入口点,这个类必须定义一个Configure方法和可选的一个ConfigureServices 方法,当应用程序启动时,他们将被调用,更多的信息请看Application Startup.(后面章节,2.4.1)
Index.cshtml 这个视图包含默认视图页的HTML
_Layout.cshtml 这个视图在Web应用中包含多个页面的的通用HTML.即母版页

HomeController.cs

控制器包含一些类,这些类处理来自浏览器的请求,检索模型数据,指定响应浏览器的视图模板

    Understanding MVC(理解MVC)

              此项目用ASP.NET MVC,MVC代表model-view-controllerMVC是一种开发应用程序的模式,是个好的框架,可测试性,且易于维护的。基于MVC应用程序包含:

• Models: 代表应用程序数据的类。使用数据验证逻辑执行业务规则。

• Views:您应用程序中使用的模板文件动态生成HTML响应。

• Controllers:是处理传入的浏览器请求,获取模型数据,然后返回一个响应浏览器的指定视图模板的类。

    Understanding .NET Core(理解.NET Core)

            .NET Core 5是一个模块化的运行时和类库实现,包括.NET Framework一个子集的。在Windows,LinuxOS X上已经设计了.NET  Core 5.NET Core 5包含一组叫做”CoreFX”的库和一个被称作”CoreCLR”的小且优化的运行时。.NET Core是开源的,你可以在项目中参考它或者在GitHub上完善它。更多的信息请看Choosing the Right

 .NET For You on the Server.(2.1.4的内容)。

      Entity Framework(实体框架)

          Entity Framework是对象关系映射(ORM)框架,您在工作时可以使用关系型数据像使用对象一样,可以消除您通常需要写的大部分数据访问代码。使用EF,您可以使用LINQ进行查询问题,检索和操作数据就像使用强类型实体。LINQ提供了查询和更新数据的模式,使用EF,使您专注于开发应用程序的其他部分,而不是专注于程序的数据访问部分。

            打开 project.json 文件,在dependencies这节中,你将看到以下和EF有关的行:

         

           这些行显示,您可以在命令窗体中输入EF命令,EF NuGet将包含在您的项目中的。

    Create a data model and scaffolding (创建数据模型和脚手架)

          Entity Framework支持一种被叫做Code First(代码优先)的开发模式。Code First允许您用类定义数据模型。在这个类中,您可以创建自定义类型通过组合其他类型的变量,方法和事件,您也可以将类映射到一个现有的数据库或者使用这些类来生成数据库。在本教程中,您将首先在Web应用程序中创建定义数据模型的实体类,然后创建一个管理实体类的上下文类并提供对数据库的数据访问。然后配置EF和填充数据库。

    Create entity classes(创建实体类)

           您创建的定义数据模式的类叫做实体类。如果您对于设计数据库是新手,可以将实体类看作是数据库中的表定义。类中的每个属性对应数据库表的一列。这些类在面向对象代码和数库的关系表结构之间提供一个轻量级的,对象关系接口。

             Web应用程序将有2个新的实体:

• Book

• Author 

           您将在解决方案资源管理器的Models文件夹中定义类,右键Models文件夹,然后选择Add>New Item.Add  New  Item的对话框中,选择Class模板,在Name的编写框中,写Author.cs,并点击Add(OK).

             

               用一下代码替换默认代码:

using System.Collections.Generic; using System.ComponentModel.DataAnnotations;
namespace ContosoBooks.Models
 {
    public class Author
    {
      [ScaffoldColumn(false)]
      public int AuthorID { get; set; }

      [Required]
      [Display(Name = "Last Name")] 
      public string LastName { get; set; }

      [Display(Name = "First Name")]
      public string FirstMidName { get; set; }

      public virtual ICollection<Book> Books { get; set; }
   }

 }

 

   按照以上步骤添加另一个类Book,并用以下代码代替:

using System.ComponentModel.DataAnnotations;

namespace ContosoBooks.Models 
  { 
    public class Book 
    { 
          [ScaffoldColumn(false)]
           public int BookID { get; set; }

           [Required] 
            public string Title { get; set; }

            public int Year { get; set; }

            [Range(1, 500)] 
            public decimal Price { get; set; }

            public string Genre { get; set; }

           [ScaffoldColumn(false)]
            public int AuthorID { get; set; }

           // Navigation property 
            public virtual Author Author { get; set; }
   }
}

 

                  为了保持应用程序简单,每本书都有一个作者,Author属性提供了一种从book到author关系导航的方式。在EF中,这种类型的属性被称作导航属性。当EF创建数据库模式时,它自动推断AuthorID应该作为Book表的外键。

   Add Scaffolding(添加框架)

             框架可以节约时间,并自动生成CRUD操作的代码。从一个简单的模型类开始,也不用写代码,就可以创建包含CRUD操作的,并与booksauthors相关的两个控制器,以及必要的视图。

 

               添加框架,在解决方案资源管理器中右击Controllers文件夹,选择Add>New Scaffolded Item.

                  

                  Add Scaffold对话框中,选择MVC 6 Controller With views,using Entity Framework,然后点击Add按钮。

          

 

                 下一步,在Add Controller对话框,设置模型类为下拉框中的Book(ContosoBooks.Models),设置数据上下文类为ApplicationDbContext (ContosoBooks.Models).确定选择Generate views的复选框,然后点击Add按钮。

           

           正如上图所示,在Add  Controller对话框中,您可以选择生成视图的选项

           这个框架创建了提供一个控制器和一组视图的代码。视图提供了UI和创建,读取,更新,删除和从数据中列出数据的代码。

          重复上面的步骤来创建一个Author控制器和相关的视图。使用Author(ContosoBooks.Models)模型类和ApplicationDbContext (ContosoBooks.Models)数据上下文,如下图所示:

          

          在解决方案资源管理器中,您将看到控制器文件夹中新添加控制器和视图文件夹中新添加的视图。

          

  Configure the web app before including sample data (在添加示例数据之前配置Web应用程序)

          接下来,在您的应用程序中添加Microsoft.Extensions.DependencyInjection包,在解决方案资源管理器中找到并打开project.json。在dependencies节点,首先输入下面一行的最后部分。

           

           您将看到智能提示提供的代码帮助,当您保存project.json,Visual Studio将会自动引用新的包。

                    

           以上被添加之后,您project.json文件的dependencies部分将出现如下:

           

"dependencies": {

   "EntityFramework.Commands": "7.0.0-rc1-final",

   "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",

   "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",

   "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",

   "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",

   "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",

   "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",

    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",

    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",

    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",

    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",

    "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",

    "Microsoft.Extensions.Configuration.FileProviderExtensions" : "1.0.0-rc1-final",

    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",

    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",

    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",

   "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",

    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",

    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final",

     "Microsoft.Extensions.DependencyInjection": "1.0.0-rc1-final"

  },

   Add sample data (添加示例数据)

         并不手动输入几个示例的记录,而是添加代码来填充数据库,在Models文件夹中添加命名为SampleData的类,如下所示:

      

using Microsoft.Data.Entity; 
using Microsoft.Extensions.DependencyInjection; 
using System; using System.Linq;
namespace ContosoBooks.Models
 {
    public static class SampleData 
     { 
        public static void Initialize(IServiceProvider serviceProvider)
        { 
         var context = serviceProvider.GetService<ApplicationDbContext>();           
         context.Database.Migrate();
         if (!context.Book.Any())
         {
          var austen = context.Author.Add( 
             new Author { LastName = "Austen", FirstMidName = "Jane" }).Entity;
         var dickens = context.Author.Add(
            new Author { LastName = "Dickens", FirstMidName = "Charles" }).Entity;
          var cervantes = context.Author.Add(
          new Author { LastName = "Cervantes", FirstMidName = "Miguel" }).Entity;

          context.Book.AddRange( 
              new Book()
             {
                   Title = "Pride and Prejudice",
                   Year = 1813,
                   Author = austen, 
                   Price = 9.99M, 
                   Genre = "Comedy of manners" 
             },
              new Book() 
              { 
                 Title = "Northanger Abbey", 
                 Year = 1817, 
                 Author = austen, 
                 Price = 12.95M, 
                 Genre = "Gothic parody"
               }, 
               new Book() 
              { 
                 Title = "David Copperfield", 
                 Year = 1850, 
                 Author = dickens,
                  Price = 15, 
                  Genre = "Bildungsroman"
                },
                new Book() 
                {
                   Title = "Don Quixote",
                   Year = 1617, 
                   Author = cervantes, 
                   Price = 8.95M, 
                   Genre = "Picaresque" 
                 }
             );
              context.SaveChanges();
          }
      }
   }
}

 

        您不用将这示例的数据类放到生成的代码中,但是对于这种简单的应用场景是合适的。

           接下来,在解决方案资源管理器中,打开Startup.cs文件,在配置方法的最后添加如下代码。

SampleData.Initialize(app.ApplicationServices);

          以上代码添加后,完整的Startup.cs文件如下所示:

 

         

using System;
using System.Collections.Generic; 
using System.Linq; using System.Threading.Tasks; 
using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Identity.EntityFramework; 
using Microsoft.Data.Entity; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 
using ContosoBooks.Models; 
using ContosoBooks.Services;
namespace ContosoBooks 
 {

    public class Startup 
       { 
          public Startup(IHostingEnvironment env) 
           {
               // Set up configuration sources.
             var builder = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
              if (env.IsDevelopment())
{
//For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
Configuration = builder.Build(); }   
public IConfigurationRoot Configuration { get; set; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddEntityFramework().AddSqlServer()
.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

               services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>()

               .AddDefaultTokenProviders();
                services.AddMvc();
           // Add application services.

            services.AddTransient<IEmailSender, AuthMessageSender>();

            services.AddTransient<ISmsSender, AuthMessageSender>();
           }
           // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

         public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

          {

             loggerFactory.AddConsole(Configuration.GetSection("Logging"));

             loggerFactory.AddDebug();
              if (env.IsDevelopment())

               {

                 app.UseBrowserLink();

                 app.UseDeveloperExceptionPage();

                 app.UseDatabaseErrorPage();

               } else

               {

                app.UseExceptionHandler("/Home/Error");
                // For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859

                  try

                   {

                     using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>() .CreateScope())

                      {

                         serviceScope.ServiceProvider.GetService<ApplicationDbContext>() .Database.Migrate();

                      }

                  } catch { }
            }
            app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
            app.UseStaticFiles();
            app.UseIdentity();
           // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715         

           app.UseMvc(routes =>

             {

               routes.MapRoute(

                   name: "default",

                   template: "{controller=Home}/{action=Index}/{id?}");

                });

             SampleData.Initialize(app.ApplicationServices);
        }
          // Entry point for the application.

          public static void Main(string[] args) => WebApplication.Run<Startup>(args);
    }
}


 

             注意在应用程序的CongureServices 中调用 Configuration.Get 可以获取数据库的链接字符串。在开发过程中,这个设置在appsettings.json文件中, 当您将应用程序部署在生产环境中,可以在主机的环境变量中设置连接字符串。如果在Conguration  API中发现相同key的环境变量,将会返回环境变量而不appsettings.json.的值。

   Build the web application(生成Web应用程序)

               确保所有的类和更改能够在您的Web应用程序中正常运行,您应该生成应用程序,在Build菜单中,选择Build Solution

 

            会显示输出窗口,如果一切正常的话,您可以看到一个成功的消息。

           

          如果遇到错误,重复上面的步骤,在输出窗口中的信息会显示那些文件有问题以及在文件中哪里必须被修改。这个信息将帮助您确定,在项目中,上述步骤中哪些是需要审查的和修改的。

    Using data migrations to create the database(通过数据迁移去创建数据库)

        在EF中,数据迁移被用来在您的整个应用程序进行模型更新。最初使用数据迁移去创建您的数据库,您可以在模型被改变之后用简单的步骤更新数据库。这将允许您更有效的生成和维护您的Web应用程序。不使用数据迁移,在数据库被创建之后,模型和结构的改变必然会导致重建整个数据库。

         在项目目录中打开一个命令提示符(ContosoBooks/src/ContosoBooks).

         在Visual Studio找到项目目录,您可以在解决方案资源管理器中右键单击项目名称(ContosoBooks),选择在文件资源管理器中打开文件夹。从文件资源管理器中复制项目路径,把路径复制到命令提示符。例如,在命令提示符输入以下更改目录:

cd C:\Projects\ContosoBooks\src\ContosoBooks

     在命令提示符中运行以下命令:

dnu restore 
dnx ef migrations add Initial
dnx ef database update

    .NET版本管理器(dnvm)是一组被用来更新和配置.NET运行时的命令行工具。

       DNX代表.NET执行环境,在您项目的project.json中指定ef命令。关于dnvm,dnu,dnx的更多信息,请看DNX Overview

       “add Initial”命令创建 一个被命名为”Initial”的迁移,可以将代码添加到项目中,并允许EF更新数据库结构。更新命令创建实际的数据库。当您运行完这个命令之后,您项目中的迁移文件夹(Migrations)将被更新,如下所示:

           

          您也可以在SQL Server Object Explorer(SQL Server对象资源管理器)内查看新创建的数据库。

            

   Adding navigation(添加导航)

        更新Web应用程序中的导航,从解决方案资源管理器中,打开Views/Shared/_Layout.cshtml文件,并找到以下标签(代码)。

<li><a asp-controller="Home" asp-action="Index">Home</a></li> 
<li><a asp-controller="Home" asp-action="About">About</a></li>
<li><a asp-controller="Home" asp-action="Contact">Contact</a></li>

    用以下代码替换以上代码:

<li><a asp-controller="Books" asp-action="Index">Books</a></li> 
<li><a asp-controller="Authors" asp-action="Index">Authors</a></li>

  上述变化将添加去查看Books和Authors链接,当在项目中添加了框架,也就创建了这些视图。

  Build the web application(构建Web应用程序)

        为了确保您的Web应用程序中的所有类和更改能够工作,应该再次生成应用程序。

        在Build菜单中,选择Build Solution (生成解决方案)

  Run the web app locally(在本地运行web应用程序)

        运行这个应用程序,可以查看所有的产品或者通过类别选出的一些产品。在解决方案资源管理器中,右键项目名称,选择View(视图)-View in Browser(在浏览器中查看)。另一种快捷方法是按F5。浏览器将会打开并且显示Web应用程序。在页面的顶部点击Books的链接.

        

        关闭浏览器,在Visual Studio 工具栏里点击”Stop Debugging”的图标来停止应用程序。

  Publish the web app to Azure App Service(在Azure 应用服务器上发布web应用程序)

        在Visual Studio的解决方案资源管理器上,右击项目,选择发布。

           

            在发布Web窗口,单击Microsoft  Azure Web Apps和登陆到你的Azure上。

            

            确保你已经激活了微软 Azure账户,然后单点New,在Azure上创建一个新的Web应用程序。

             

             输入一个唯一的网站站点名称,选择一个应用程序服务计划,资源组,和地区。另外,选择一个数据库服务器,并填写数据库用户名和密码。如果您在过去已经创建一个数据库服务器,就可以使用已经创建的数据库服务器。当您想要继续的话,就点击Create.

               

              在Publish Web窗口的Connection选项卡中,点击Publish.

              

              你可以查看发布进程在Visual Studio的Output(输出)窗口或者Azure App Service Activity(Azure 应用程序服务活动)窗口。

              

             当您的网站在Azure上发布完成时,将显示浏览器里,并运行在Azure

          

    更多的发布信息,请看 Publishing and Deployment.

     Additional Resources(更多资源)

 • Introduction to ASP.NET 5

 •Understanding ASP.NET 5 Web Apps

 

 • ASP.NET 5 Fundamentals

 

posted @ 2016-02-26 14:58  人生只如初见  阅读(433)  评论(6)    收藏  举报