浏览器中的.net,第1部分

在本文和教程中,我们将使用BLazor将C#引入浏览器。我们将讨论您能做什么,以及您在创建BLazor应用程序时必须考虑的问题。 WebAssembly是一个伟大的平台,有望在浏览器上实现革命性的开发。多亏了WebAssembly,JavaScript不再是您在为Web开发时可以使用客户端的唯一语言。这是一个令人兴奋的平台,我们已经讨论过了。理解WebAssembly。在本文中,我们将进一步了解如何使用运行在WebAssembly上的平台:BLazor。 究竟什么是巴兹尔? 用C#和WebAssembly进行全栈web开发 你能用C做的每一件事,你都可以在BLazor上做。除此之外,您显然可以与JavaScript代码进行交互,就像您期望执行WebAssembly项目一样。 从技术上讲,BLazor运行在Mono上,这是一个开源的跨平台版本的.NET Framework,由xamarin公司开发,现在是微软的一部分。因此,它不运行在.NET Core上。这是一种技术信息,一般不会产生什么实际影响,但在某些情况下了解可能是有用的。此外,在不存在WebAssembly的旧浏览器中,BLazor依赖于asm.jsJavaScript的子集。 在导言中最后要说的是,BLazor仍然是一个实验项目,但它已经相当成功了:官方网站,一个很好的社区资源. 为什么是巴兹尔? 为什么要用C#代替JavaScript呢?通常的原因是,您可能更喜欢一种语言而不是另一种语言: 更好地支持你关心的事情。 支持的旧代码库。 需要统一的代码库。 此外,在管理大型复杂项目时,JavaScript也有一点不足。为此,发明了不止一种语言。最成功的可能是打字稿,它的口号是:缩放JavaScript。C#可以是另一种解决方案,允许您将它用于应用程序的复杂部分,并将JavaScript留给UI。 设置BLazor 你只需要使用BLazor.NET Core 2.1.300 SDK或者晚些时候。如果使用VisualStudio,还可以安装BLazor语言服务扩展要在IDE中提供BLazor模板,请执行以下操作。但是,它不需要使用VisualStudio。实际上,在本文中,我们将使用VisualStudio代码。 您可能会想知道我们为什么要使用.NET Core,尽管我们刚刚说过BLazor依赖于Mono。当然,BLazor运行在Mono上,就像您在Dist文件夹中看到的那样:mono.wasm包含编译到WebAssembly的Mono,mono.js文件包含胶水代码。 然而,应用程序也必须以某种方式分发给用户。默认模板使用ASP.NETCore和Web服务器来完成;就像典型的JavaScript应用程序一样。理论上,你可以用其他方式打包它,比如一个电子应用程序,但这仍然是不受支持的。 一旦你有了已安装.NET Core如果不使用VisualStudio,则可以从命令行安装BLazor模板。 # install the Blazor Templates dotnet new -i Microsoft.AspNetCore.Blazor.Templates # create a new Blazor App dotnet new blazor -o BlazorApp # run the app, as usual cd BlazorApp dotnet run 在创建BLazor应用程序时,您应该转到指定的地址(通常是localhost:5000或localhost:5001和TLS),以检查一切是否正常。如果你看到像下面这样的图像,一切都很好。 常见错误 相反,如果您看到一个空白页,有些地方是错误的。最可能的错误是,您已经安装了.NET CoreSDK的旧版本。记住,即使您有错误版本的.NET Core SDK,仍然可以成功安装模板并创建应用程序。安装将成功,但应用程序将无法工作。因此,请检查是否使用了.NET Core SDK的正确版本。 目前,如果您访问正式的.NET网站,默认情况下,Windows和MacOS将获得正确的版本,但对于某些Linux发行版,您可能仍然会获得较旧的版本。例如,对于Ubuntu,.NET Core SDK 2.1.300仍然处于发布候选阶段。 重要的是要记住,.NET程序集保持不变,只有.NET框架(即Mono)被编译到WebAssembly。这意味着任何C#代码在BLazor中的工作方式都应该与在任何其他.NET实现中的工作方式相同。 在本文中,我们将使用Blazor version 0.5.1. Bazor应用程序的剖析 现在,一切都是正确的设置,我们可以创建我们的第一个BLazor应用程序。但是,首先,让我们看一下默认模板,特别是Index.cshtml文件下Pages。这是我们第一次发布这个应用程序时看到的同样的页面,用来测试它是否正常工作。 @page “/”

Hello, world!

Welcome to your new app. 这是一个短页,但它包含了一些有趣的东西。这是一种传统剃须刀页面,这是很好地使用在C#世界,但与一些BLazor添加。如果您从未使用过Razor,您仍然可以很容易地理解它,因为它是一种典型的模板语言,与HTML混合使用。 选路 这,这个,那,那个@page指令用于配置路由。这意味着当主根目录(/)请求。还可以使用普通的ASP.NET路由参数,如下面的示例所示。 @page “/{name}” 此页面将URL中指定的值赋值给变量name。注意,目前不支持可选元素。因此,要支持带有可选参数的路由,您必须添加到页面指令中,一个带有可选参数,另一个没有。 // in normal ASP.NET you would write “/{name?}” for an optional parameter @page “/” @page “/{name}” 元素 这个页面的第二个有趣之处是最后一行,SurveyPrompt元素。它看起来和行为都像一个普通的HTML元素,但显然不是。实际上,它是BLazor所称的组件,它是在SurveyPrompt.cshtml页下的Shared文件夹。在BLazor中,任何页面都使用相同的名称定义相应的组件。
@Title Please take our brief survey and tell us what you think.

@functions {
[Parameter]
string Title { get; set; } // Demonstrates how a parent component can supply parameters
}
在第3行中,我们看到了显示变量的语法。Title在HTMLUI中。这是标准的Razor语法。新的特定于BLazor的部分在末尾,其中functions指令。在这里,我们可以使用标准C#向页面添加功能。注意,Title属性,我们在索引页中使用了它,它在这个函数部分中被配置为一个参数。这是用[Parameter]注释

通航
最后,让我们看看BLazor应用程序的标准模板,页面NavMenu.cshtml.

  • 这是一个菜单项的示例,该菜单项使用NavLink 组件,它基本上是一个添加css类的简单元素。active当元素被选中时。让我们进行一些清理,并从标准模板中删除一些我们不打算使用的内容。我们添加这个元素并删除已经存在的元素。然后删除相应的页面并添加一个名为Calendar.cshtml。所以,我们的页面现在应该是这样的。

    创建我们的应用程序
    在我们的应用程序中,我们希望在几个不同的日历中显示相同日期的页面。

    @page “/”
    @page “/calendar”
    我们将页面与默认路由和路由日历相关联。这一点很有用:在启动应用程序时,您将看到在更改页面时会发生什么。当访问其中一个页面时,底层数据将保持不变。因此,它们不是两个不同的页面,而是一个页面的同一个实例,而是一个对应于两个不同地址的实例。

    @page “/”
    @page “/calendar”

    Date in Different Calendars

    Select a date

    Convert Date
    Julian Calendar

    @calendarDate.JulianDate

    [..]
    [..]

    UI分为两部分:第一部分包含输入,第二部分以不同的日历显示用户提供的相同数据。第9行中的输入绑定到变量。date,同时,作为占位符,我们使用字段DateTime.Now。在第11行,我们使用标准的HTML语法将一个函数绑定到Click操作。这基本上就像它是一个JavaScript函数一样。

    我们显示日历的部分在这里只显示了一部分,因为这是相当重复的。存储库中的最终版本包含三个行,每个行有三个日历,总共有九个日历。每个日历看起来都像这里显示的那样:一张卡片(卡片是一个引导元素),显示日历的名称和日期本身。日期是我们创建的自定义类的字段。

    @functions {
    string date = DateTime.Today.ToString(“yyyy-MM-dd”);
    CalendarDate calendarDate = new CalendarDate();
    void ConvertDate()
    {
    if (!string.IsNullOrWhiteSpace(date))
    {
    calendarDate.StringDate = date;
    }
    }
    }
    包含functions指令没有任何意外:我们在UI中设置了我们需要的变量和函数。只需选择一个带有输入元素的日期,然后单击按钮,就可以在日历中显示的日期中转换输入日期。这是在C#中实现的动态行为,这正是我们所需要的。但那CalendarDate班级,等级

    C#宪兵级
    这是一个我们可以创建的类:首先,我们需要添加一个新的根级C#文件,名为CalendarDate.cs.

    using System;
    using System.Globalization;
    using System.Text;
    public class CalendarDate
    {
    private String stringDate = DateTime.Now.ToString();
    public String StringDate {
    get {
    return stringDate;
    }
    set {
    stringDate = value;
    Date = DateTime.Parse(stringDate);
    }
    }
    public DateTime Date { get; set; } = DateTime.Now;
    private string GetDateForCalendar(Calendar cal)
    {
    if(Date > cal.MinSupportedDateTime && Date < cal.MaxSupportedDateTime)
    return $”{cal.GetDayOfMonth(Date):d2}/{cal.GetMonth(Date):d2}/{cal.GetYear(Date):d4}”;
    else
    return “Invalid Date”;
    }
    public string JulianDate
    {
    get {
    Calendar cal = new JulianCalendar();
    return GetDateForCalendar(cal);
    }
    }
    [..]
    }
    这是简单的C#代码,没有什么特别之处。当我们将一个值赋值给StringDate字段中,我们还自动将相应的值赋值给Date场。基本上,输入是String,但我们需要将其转换为DateTime变量。在第17行中,我们将默认值赋值给Date字段,以便最初的日历显示有效日期。

    这,这个,那,那个GetDateForCalendar如果选定的日期对该日历有效(第21行),则确保将其转换为在指定日历中保存该日期表示的字符串(第22行)。如果日期无效,则返回一个字符串来表示该日期。这是必要的,因为并非所有日历都可以处理所有日期,有时是日历本身的问题,有时是.NET实现的问题,或者是我们不处理电子逆向拍卖的概念这一事实。

    Image title

    在我们在文件中添加了一些css之后www-root/css/site.css(未显示),我们可以用dotnet run。最后的结果很好。

    Image title

    看看这个动态行为,没有任何JavaScript的暗示。

    那么,我们能完全抛弃JavaScript吗?嗯,不完全是。您可能希望继续使用JavaScript来操作DOM。尽管在了解如何与JavaScript交互之前,让我们看看BLazor中的一些问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值