65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET MVC 6 结合 JSPM 和 Material Design Lite

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (9投票s)

2015 年 8 月 25 日

CPOL

3分钟阅读

viewsIcon

40507

本文将介绍如何在 ASP.NET MVC 6 中使用 JSPM 和 Material Design Lite。

引言

ASP.NET MVC 6.0 在几个月前发布,并带来了 大量 特性。随着 Visual Studio 2015 的发布,前端开发也得到了提升。我一直在从事 Node.js 项目,发现 Node.js 对于前端开发非常棒(在某些情况下,通过 MEAN 栈,它也适用于后端)。这使得我们能够非常快速地开发新项目,并且 Node.js 社区拥有海量插件,也非常令人惊叹。回到 .NET 世界,许多很棒的功能让我感到编写代码非常舒适。ASP.NET MVC 6.0 在我们创建解决方案时内置支持 NPMBower 包管理器。这很好,大家都知道。

此外,目前许多公司都在使用 ES 2015 (ES6)。这让我很高兴能在 ASP.NET MVC 6.0 解决方案中使用它。到目前为止,大家通常使用 BabelTraceur 来让它完美运行(Polyfill),而使用 JSPM,你可以做得更多。

默认情况下,ASP.NET MVC 6.0 允许你使用 Twitter Bootstrap 来轻松布局和开发 UI。但是,Google 的 Material Design 方法论简直太棒了。

说太多了,我现在就来展示如何在同一个解决方案中实现这一切。

准备软件和工具

  • Visual Studio 2015 Community
  • .NET 4.6 (1.0.0-beta5)
  • ASP.NET MVC 6.0
  • NodeJS v0.12.7
  • JSPM v0.15.7
  • Gulp v3.8.11

源代码

你可以在 我的 github 上找到所有源代码。

创建解决方案

打开 Visual Studio 2015 Community,然后选择 File -> New -> Project,选择 Web -> .NET 4.6,然后创建一个 Web 解决方案。解决方案创建完成后,我们直接删除 bower.json 文件,因为我们不想再使用 bower 了。

初始化 JSPM

打开命令行,并将路径更改到你刚刚创建的项目。然后我们输入

jspm init

然后 JSPM 会引导我们创建 JSPM 配置文件,但请确保我们将 JSPM 路径指向

wwwroot\lib

整个 package.json 文件将如下所示

{
  "name": "MazWebApp",
  "version": "0.0.0",
  "devDependencies": {
    "gulp": "3.8.11",
    "gulp-concat": "2.5.2",
    "gulp-cssmin": "0.1.7",
    "gulp-uglify": "1.2.0",
    "rimraf": "2.2.8"
  },
  "jspm": {
    "directories": {
      "baseURL": "wwwroot",
      "packages": "wwwroot/lib"
    },
    "dependencies": {
      "hammer": "github:hammerjs/hammer.js@^2.0.4",
      "ixisio/bootstrap-touch-carousel": "github:ixisio/bootstrap-touch-carousel@^0.8.0",
      "jquery": "github:components/jquery@^2.1.4",
      "jquery-validation": "github:jzaefferer/jquery-validation@^1.14.0",
      "jquery-validation-unobtrusive": "github:aspnet/jquery-validation-unobtrusive@^3.2.2"
    },
    "devDependencies": {
      "babel": "npm:babel-core@^5.1.13",
      "babel-runtime": "npm:babel-runtime@^5.1.13",
      "core-js": "npm:core-js@^0.9.4"
    }
  }
}

JSPM 还在 ./wwwroot 文件夹内创建了一个 config.js 文件。

如果你不知道如何安装 JSPM 包,请从 这里 开始。

将 Material Design Lite (MDL) 引入我们的解决方案

这是我们将 MDL 引入我们的项目的一步。打开 \Views\Shared\_Layout.cshtml 文件,然后添加

<!-- Material Design Lite -->
<script src="https://storage.googleapis.com/code.getmdl.io/1.0.4/material.min.js"></script>
<link rel="stylesheet" href="https://storage.googleapis.com/code.getmdl.io/1.0.4/material.indigo-pink.min.css">
<!-- Material Design icon font -->
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">

我不使用 JSPM 来安装 MDL,因为我想直接指向 Google CDN。但如果你愿意,也可以使用 JSPM 来安装,其他部分保持不变。

在此文件的底部,我们需要添加一些脚本,例如

<script src="~/lib/system.js" type="text/javascript"></script>
<script src="~/config.js" type="text/javascript"></script>
<script>
    System.import("js/site").catch(console.log.bind(console));
</script>

就这样。现在我们可以使用 MDL 来布局我们的 UI 了。布局应该如下

<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="description" content="Magazine Website, a simple website about magazines.">
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>@ViewData["Title"] - Magazine Website</title>

    <!-- Material Design Lite -->
    <script src="https://storage.googleapis.com/code.getmdl.io/1.0.4/material.min.js"></script>
    <link rel="stylesheet" href="https://storage.googleapis.com/code.getmdl.io/1.0.4/material.indigo-pink.min.css">
    <!-- Material Design icon font -->
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">

    <link rel="stylesheet" href="~/css/site.css"/>
</head>
<body>
<div class="mdl-layout mdl-js-layout">
    <header class="mdl-layout__header mdl-layout__header--waterfall">
        <!-- Top row, always visible -->
        <div class="mdl-layout__header-row">
            <!-- Title -->
            <span class="mdl-layout-title">Magazine Website</span>
            <div class="mdl-layout-spacer"></div>
            <div class="mdl-textfield mdl-js-textfield mdl-textfield--expandable
                mdl-textfield--floating-label mdl-textfield--align-right">
                <label class="mdl-button mdl-js-button mdl-button--icon"
                       for="waterfall-exp">
                    <i class="material-icons">search</i>
                </label>
                <div class="mdl-textfield__expandable-holder">
                    <input class="mdl-textfield__input" type="text" name="sample"
                           id="waterfall-exp"/>
                </div>
            </div>
        </div>

    </header>

    <div class="mdl-layout__drawer">
        <span class="mdl-layout-title">Magazine Website</span>
        <nav class="mdl-navigation">
            <a asp-controller="Home" asp-action="Index" class="mdl-navigation__link">Home</a>
            <a asp-controller="Home" asp-action="About" class="mdl-navigation__link">About</a>
            <a asp-controller="Home" asp-action="Contact" class="mdl-navigation__link">Contact</a>
            <hr/>
            @await Html.PartialAsync("_LoginPartial")
        </nav>
    </div>

    <main class="mdl-layout__content">
        <div class="mdl-grid page-content">
            @RenderBody()
        </div>
    </main>

    <footer class="mdl-mini-footer">
        <div class="mdl-mini-footer--left-section">
            <p>&copy; 2015 - MazWebApp</p>
        </div>
    </footer>
</div>

<script src="~/lib/system.js" type="text/javascript"></script>
<script src="~/config.js" type="text/javascript"></script>
<script>
    System.import("js/site").catch(console.log.bind(console));
</script>
@RenderSection("scripts", false)
</body>
</html>

上面的代码仅用于此网站的主布局(看起来像 Web Forms 中的母版页)。

注册页面的标记如下

<div class="mdl-cell mdl-cell--12-col">
    <form asp-controller="Account"
          asp-action="Register"
          method="post" 
          role="form">
        <div class="mdl-grid page-container">
            <div class="mdl-cell mdl-cell--12-col page-row">
                <h3 class="page-title">Create a new account</h3>
                <hr>
                <div asp-validation-summary="ValidationSummary.All"></div>
            </div>
            <div class="mdl-cell mdl-cell--6-col page-row">
                <div class="mdl-grid page-container">
                    <div class="mdl-cell mdl-cell--12-col page-row">
                        <div class="mdl-textfield mdl-js-textfield mdl-cell mdl-cell--12-col">
                            <label asp-for="Email" class="mdl-textfield__label"></label>
                            <input asp-for="Email" class="mdl-textfield__input"/>
                            <span asp-validation-for="Email" class="mdl-textfield__error"></span>
                        </div>
                    </div>
                    <div class="mdl-cell mdl-cell--12-col page-row">
                        <div class="mdl-textfield mdl-js-textfield mdl-cell mdl-cell--12-col">
                            <label asp-for="Password" class="mdl-textfield__label"></label>
                            <input asp-for="Password" class="mdl-textfield__input"/>
                            <span asp-validation-for="Password" class="mdl-textfield__error"></span>
                        </div>
                    </div>
                    <div class="mdl-cell mdl-cell--12-col page-row">
                        <div class="mdl-textfield mdl-js-textfield mdl-cell mdl-cell--12-col">
                            <label asp-for="ConfirmPassword" class="mdl-textfield__label"></label>
                            <input asp-for="ConfirmPassword" class="mdl-textfield__input" />
                            <span asp-validation-for="ConfirmPassword" class="mdl-textfield__error"></span>
                        </div>
                    </div>
                </div>
            </div>
            <div class="mdl-cell mdl-cell--12-col page-row">
                <button type="submit"
                        class="mdl-button mdl-js-button 
                            mdl-button--raised mdl-button--colored
                            mdl-js-ripple-effect">
                    Register
                </button>
            </div>
        </div>
    </form>
</div>

正如你所见,标记的 HTML 只使用了 MDL 库中的样式表。目前,MDL 团队正在开发许多组件(例如 Dialog...),但这些组件仍处于预发布状态。

请访问 我的 github 查看更多页面

我们的解决方案结构将是

编写一些 ES6 Javascript 代码

现在我们可以在解决方案中编写任何 ES6 Javascript 代码了。我将一些示例代码放在下面

(($) => {
    $(document).ready(() => {
        
        console.log("It works");

        $(".delete-product").on("click", (e) => {
            const DELETE_URL = "/product/delete";

            let $delBtn = $(e.target)
                , productId = $delBtn.data("id");

            $.ajax({
                url: DELETE_URL,
                data: {
                    id: productId
                },
                method: "POST"
            }).done((result) => {
                if (result.reload === true) {
                    window.location =  "/product";
                }
            });
        });
    });
})(jQuery);

布局

首页

登录页面

注册页面

这就是我今天想与你分享的所有内容。

欢迎提出任何建议。

感谢您的阅读。

编码愉快 :)

历史

0.0.1: 草稿版本。

1.0.0: 更新了代码格式。

1.0.1: 更新了分类(C# 到 ASP.NET)。

1.0.2: 修正了英语语法并对代码进行了更多解释。

参考文献

 

© . All rights reserved.