整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

ASP.NET Razor-C 和 VB 代码语法

azor 同时支持 C# (C sharp) 和 VB (Visual Basic)。


主要的 Razor C# 语法规则

  • Razor 代码块包含在 @{ ... } 中

  • 内联表达式(变量和函数)以 @ 开头

  • 代码语句用分号结束

  • 变量使用 var 关键字声明

  • 字符串用引号括起来

  • C# 代码区分大小写

  • C# 文件的扩展名是 .cshtml

C# 实例

<!-- Single statement block -->

@{ var myMessage ="Hello World"; }

<!-- Inline expression or variable -->

<p>The value of myMessage is: @myMessage</p>

<!--Multi-statement block -->

@{

var greeting = "Welcome to our site!";

var weekDay = DateTime.Now.DayOfWeek;

var greetingMessage = greeting + " Here in Huston it is: " + weekDay;

}

<p>The greeting is: @greetingMessage</p>

运行实例 »


主要的 Razor VB 语法规则

  • Razor 代码块包含在 @Code ... End Code 中

  • 内联表达式(变量和函数)以 @ 开头

  • 变量使用 Dim 关键字声明

  • 字符串用引号括起来

  • VB 代码不区分大小写

  • VB 文件的扩展名是 .vbhtml

实例

<!-- Single statement block -->

@Code dim myMessage = "Hello World" End Code

<!-- Inline expression or variable -->

<p>The value of myMessage is: @myMessage</p>

<!-- Multi-statement block -->

@Code

dim greeting = "Welcome to our site!"

dim weekDay = DateTime.Now.DayOfWeek

dim greetingMessage = greeting & " Here in Huston it is: " & weekDay

End Code

<p>The greeting is: @greetingMessage</p>

运行实例 »


它是如何工作的?

Razor 是一种将服务器代码嵌入在网页中的简单的编程语法。

Razor 语法是基于 ASP.NET 框架,专门用于创建 Web 应用程序的部分 Microsoft.NET 框架。

Razor 语法支持所有 ASP.NET 的功能,但是使用的是一种简化语法,对初学者而言更容易学习,对专家而言更有效率的。

Razor 网页可以被描述成带以下两种类型内容的 HTML 网页: HTML 内容和 Razor 代码。

当服务器读取页面时,它首先运行 Razor 代码,然后再发送 HTML 页面到浏览器。在服务器上执行的代码能够执行一些在浏览器上不能完成的任务,比如,访问服务器数据库。服务器代码能创建动态的 HTML 内容,然后发送到浏览器。从浏览器上看,服务器代码生成的 HTML 与静态的 HTML 内容没有什么不同。

带 Razor 语法的 ASP.NET 网页有特殊的文件扩展名 cshtml(Razor C#)或者 vbhtml(Razor VB)。


使用对象

服务器编码往往涉及到对象。

"Date" 对象是一个典型的内置的 ASP.NET 对象,但对象也可以是自定义的,一个网页,一个文本框,一个文件,一个数据库记录,等等。

对象有用于执行的方法。一个数据库记录可能有一个 "Save" 方法,一个图像对象可能有一个 "Rotate" 方法,一个电子邮件对象可能有一个 "Send" 方法,等等。

对象也有用于描述各自特点的属性。一个数据库记录可能有 FirstName 和 LastName 属性。

ASP.NET Date 对象有一个 Now 属性(写成 Date.Now),Now 属性有一个 Day 属性(写成 Date.Now.Day)。下面实例演示了如何访问 Data 对象的一些属性:

实例

<table border="1">

<tr>

<th width="100px">Name</th>

<td width="100px">Value</td>

</tr>

<tr>

<td>Day</td><td>@DateTime.Now.Day</td>

</tr>

<tr>

<td>Hour</td><td>@DateTime.Now.Hour</td>

</tr>

<tr>

<td>Minute</td><td>@DateTime.Now.Minute</td>

</tr>

<tr>

<td>Second</td><td>@DateTime.Now.Second</td>

</tr>

</td>

</table>

运行实例 »


If 和 Else条件

动态网页的一个重要特点是,您可以根据条件决定做什么。

做到这一点的常用方法是使用 if ... else 语句:

实例

@{

var txt = "";

if(DateTime.Now.Hour > 12)

{txt = "Good Evening";}

else

{txt = "Good Morning";}

}

<html>

<body>

<p>The message is @txt</p>

</body>

</html>

日常工作中(主要使用ASP.net),我需要编写很多JavaScript代码。我做的最重复的任务之一是jQuery Ajax调用。你看:

$.ajax({
    type: "POST",
    url: "MyPage.aspx/MyWebMethod",
    data: "{parameter:value,parameter:value}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        //function called successfull
    },
    error: function(msg) {
        //some error happened
    }
});


我不知道对您来说是否相同,但是对我来说用这种语法编写调用太麻烦了。而且,以前必须按照已知规则使用参数构建字符串以传递给WebMethod:字符串必须用引号传递,数字不能传递,等等。
因此,我决定创建一个小而有用的JavaScript类来帮助我有了这个特定的问题,现在我已经完成了jQuery Ajax调用,这对我来说非常友好。
在类构造函数中,我传递页面名称,方法名称以及成功和错误函数。以后,我会根据需要对addParam方法进行尽可能多的调用。最后,我调用run方法进行Ajax调用。成功函数和错误函数必须分别编写。
参数根据其类型进行处理。如果参数是字符串,则使用引号。如果是数字,我不会。日期参数是一种特殊情况。在这种情况下,我使用JavaScript日期对象的getTime()函数,该函数给了我自1970年1月1日以来的日期的毫秒数。后来,我将该值转换为UTC时间,这样我得到了一个最终的毫秒数,即我可以将Int64值传递给我的VB.net(或C#)代码,用它来重建.Net中的日期值。
这是我的jAjax类的完整列表(末尾带有日期帮助器功能):

function jAjax(pageName, methodName, successFunc, errorFunc) {
    //stores the page name
    this.pageName = pageName;
    //stores the method name
    this.methodName = methodName;
    //stores the success function
    this.successFunc = successFunc;
    //stores the error function
    this.errorFunc = errorFunc;
    //initializes the parameter names array
    this.paramNames = new Array();
    //initializes the parameter values array
    this.paramValues = new Array();

    //method for add a new parameter (simply pushes to the names and values arrays)
    this.addParam = function(name, value) {
        this.paramNames.push(name);
        this.paramValues.push(value);
    }

    //method to run the jQuery ajax request
    this.run = function() {
    //initializes the parameter data string
        var dataStr = '{';
        //iterate thru the parameters arrays to compose the parameter data string
        for (var k = 0; k < this.paramNames.length; k++) {
            //append the parameter name
            dataStr += this.paramNames[k] + ':';
            if (typeof this.paramValues[k] == 'string') {
                //string parameter, append between quotes
                dataStr += '"' + this.paramValues[k] + '",';
            } else if (typeof this.paramValues[k] == 'number') {
                //number parameter, append "as-is" calling toString()
                dataStr += this.paramValues[k].toString() + ',';
            } else if (typeof this.paramValues[k] == 'object') {
                if (this.paramValues[k].getTime != undefined) {
                    //date value
                    //call to my getUtcTime function to get the number of
                    //milliseconds (since january 1, 1970) in UTC format
                    //and append as a number
                    dataStr += getUtcTime(this.paramValues[k]).toString() + ',';
                } else {
                    //object value
                    //because I don't know what's this, append the toString()
                    //output
                    dataStr += '"' + this.paramValues[k].toString() + '",';
                }
            }
        }
        //if some parameter added, remove the trailing ","
        if (dataStr.length > 1) dataStr = dataStr.substr(0, dataStr.length - 1);
        //close the parameter data string
        dataStr += '}';

        //do the jQuery ajax call, using the parameter data string
        //and the success and error functions
        $.ajax({
            type: "POST",
            url: this.pageName + "/" + this.methodName,
            data: dataStr,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
                successFunc(msg);
            },
            error: function(msg) {
                errorFunc(msg);
            }
        });
    }
}

function getUtcTime(dateValue) {
    //get the number of milliseconds since january 1, 1970
    var time = dateValue.getTime();
    //get the UTC time offset in minutes. if you created your date with
    //new Date(), maybe this contains a value. but if you compose the date
    //by yourself (i.e. var myDate = new Date(1984,5,21,12,53,11)) this will
    //be zero
    var minutes = dateValue.getTimezoneOffset() * -1;
    //get the milliseconds value
    var ms = minutes * 60000;
    //add to the original milliseconds value so we get the GMT exact value
    return time + ms;
}



这是使用的语法:

var ajaxCall = new jAjax('MyPage.aspx','MyWebMethod',successFunc,errorFunc);
ajaxCall.addParam('s','this is a string');
ajaxCall.addParam('n',34);
ajaxCall.addParam('d',new Date());
ajaxCall.run();

function successFunc(msg) {
    ...
}

function errorFunc(msg) {
}



另外一个好处是,您可以将成功和错误功能重新用于几个ajax调用。
希望对您有帮助!!随时在您的应用程序中使用jAjax类。

、前言

继微软抛弃IE浏览器全面拥抱Chromium内核推出Edge浏览器后,一直在关注那老旧的webbrowser未来如何发展。虽然编程语言千千万,也有人不看好winform编程,但在当前windows依旧占据相当的市场份额。在webbrowser中官方支持的是IE内核,而IE内核又跟你的电脑的安装版本有关系,再加上IE对各种html前端支持的不友好。vuejs都已经彻底抛弃了IE浏览器,迟迟不敢在生产环境大量应用vueweb应用。(有人可能会说可以换webkit或者cesharp内核,笔者也尝试过,但毕竟不是微软的亲生,各种不友好,各种复杂,webkit都多久没更新了,根据历史经验过于复杂的东西一般很难长久)。
之前关注过webview2,但那段时间刚出支持也不是很友好,无法很有效继承,有说要安装edge浏览器的,又说要安装别的,而win7可能又不支持等等,而恰好我们的场景用又存在大量的win7,只能暂时放弃。
最近要应用Vue,重新关注了一下相关应用,很惊喜的发现,webview2有了官方比较好的支持(可能早就有了,但是肯定不会超过1年)微软官方文档链接WebView2 - Microsoft Edge Developer

如果本文有不对的地方还要以官方文档为准,研究不深。先说体验效果,webview2真的很好,内核彻底替换为chromium,Vue项目跑起来了也不用担心各种不兼容了,终于不用为webbrowser担忧了。由于项目使用的VB.NET(不要问为甚么不是C#,我会一点,但是用不到),因此考虑到系统中的使用还是集成到了VB.NET中,在搜索过程中发现webview2的资料不多,一些属性还没有很好的案例,可能与winform的没落有关系吧,而且相关介绍均是C#的,也包括官方文档。因此在基本集成以后,通过这篇文章做简单分享与记录。这里的集成比较简单,主要是满足WEB和客户端的混合编程,也是webview2介绍中的重要应用之一,毕竟WEB才是管理系统的未来。

二、Webview2 简单介绍

Webview2 加了个2可能是为了跟安卓的webview区分吧,毕竟一搜webview出来的全是安卓的。

Webview2支持win7、win8、win10以及对应的server版本,可以说是涵盖了windows的江山,具体的版本说明可以参考官方文档。如果你说还有xp,天就被聊死了,我们不是一路人。

从搜到的帖子看大家对于webview2还是持肯定态度的,比webkit,cefsharp的兼容性要好的多,从我的体验来讲它可以完全替代webbrowser控件,正在生产环境中替代原有webbrowser控件。

三、环境配置

Webview2虽然没有了IE一堆乱糟糟的版本问题,但是Webview2毕竟是依赖与Edge诞生的产品,它依然需要一定的环境,微软提供了2种方案。

  • Webview2 runtime 运行时环境,分为x86,x64,arm版本,按照对应版本下载即可,通过实测在64位安装x86版本也可以使用,但还是建议按照对应版本安装。在前面给到的微软官方链接可以安装
  • Microsoft Edge 预览体验成员(预览版) 注意不是我们附带的发布版的edge,是单独的预览版,有3款可以选择,官方建议candy版天天更新。

这里选择的是Webview2 runtime毕竟我们是集成环境,这里可以根据需要选择。

  • 开发工具要求VS2017以上,案例使用的vs2017
  • .net版本 有说要4.6.2以上的,官方文档选的4.7.2。案例实测4.5.2中可用。

四、进入正题

官方文档是C#的比较简单,C#er们自行阅览即可,毕竟在大神面前我只是个渣渣。

1、引入Webview2

  • "解决方案资源管理器"中,右击项目名称,然后选择"管理 NuGet 包
  • 在搜索栏中,键入并单击"Microsoft.Web.WebView2"。WebView2

  • 工具箱中就有了webview2控件了,拖拽即可,不过多解释

2、关键方法、事件

  • 导航方法(链接跳转)
WebView21.CoreWebView2.Navigate(im_ipurl)
  • 自动检测安装Webview2 runtime(放在WebView21_CoreWebView2InitializationCompleted事件中)
    Function installruntime()
        Try
            Dim v As String = WebView21.Source.ToString
            Me.Text = ("Copyright © 2021-2022 lxfamn, All Rights Reserved " )
        Catch ex As Exception
            If Environment.Is64BitOperatingSystem Then
                MsgBox("系统全面升级浏览器内核,接下来系统将自动为您安装补丁,请在弹出窗口选运行,64位系统")
                Process.Start("\\运行组件共享路径\webruntime\X64.exe")
            Else
                MsgBox("系统全面升级浏览器内核,接下来系统将自动为您安装补丁,请在弹出窗口选运行,32位系统")
                Process.Start("\\运行组件共享路径\webruntime\X64.exe")
            End If

        End Try
    End Function
   Private Sub WebView21_CoreWebView2InitializationCompleted(sender As Object, e As CoreWebView2InitializationCompletedEventArgs) Handles WebView21.CoreWebView2InitializationCompleted
        installruntime()
        WebView21.CoreWebView2.Navigate(im_ipurl & "/home")

    End Sub
  • NavigationCompleted 相当于webbrowser documnentcomplete事件

事件执行流程如下图所示:

3、最关键、复杂的流程

webview与主机程序的交互过程,在原有的webbrowser中在WebBrowser1_DocumentCompleted事件中通过对WebBrowser1.DocumentText的解析可以做进行不同的处理。

  • CoreWebView2 是webview2下的一个核心方法,感觉像是内核中的一些方法

在webview2中没有了上述事件和方法,取而代之的是postMessage,官方案例使用的C#,使用了aysn异步绑定等方式。

简单可以理解为,提供了WebView21.CoreWebView2.ExecuteScriptAsyncWebView21.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync方法,向站点注入javasript程序来实现相关功能,这里我只使用了ExecuteScriptAsync方法,在NavigationCompleted事件,在页面加载完成后向主机发送消息,WebView21_WebMessageReceived 事件中接受发送的消息。

  Private Sub WebView21_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WebView21.NavigationCompleted
        TextBox1.Text = WebView21.Source.ToString()'导航完成后,在标题栏中显示当前网址
        If (TextBox1.Text.Contains("www.microsoft.com")) Then
            WebView21.CoreWebView2.Navigate("https://blog.lxfamn.cn/?cat=101")
        End If
        WebView21.CoreWebView2.ExecuteScriptAsync("window.chrome.webview.postMessage(document.body.innerHTML);")
    End Sub
    Private Sub WebView21_WebMessageReceived(sender As Object, e As CoreWebView2WebMessageReceivedEventArgs) Handles WebView21.WebMessageReceived
        webdeal(e.WebMessageAsJson.ToString)'根据接收的消息进行逻辑处理
    End Sub

4、其他的一些

建议结合官方文档进行阅览,理解一些方法和规则,一些方法和过程在官方文档中解释还是比较清楚的,本文主要是帮助解释一些在vb.net以及一些逻辑等问题的解释。

附上一些处理url自动补充前缀的方法

 Function geturl(dealway As String)
        Try
            Dim urlstr As String = TextBox1.Text
            If Not urlstr.Contains("http") Then
                Dim re As New Regex("((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}")
                Dim Contents As MatchCollection = re.Matches(urlstr)
                Dim rea As New Regex("[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?")
                Dim Contentsa As MatchCollection = rea.Matches(urlstr)
                If Contentsa.Count > 0 Or Contents.Count > 0 Then

                    urlstr = "http://" & urlstr
                Else
                    If dealway = "百度" Then
                        urlstr = "https://www.baidu.com/s?wd=" & urlstr
                    End If
                    If dealway = "blog" Then
                        urlstr = "https://blog.lxfamn.cn/?cat=101"

                    End If
                
                End If
            End If
            WebView21.CoreWebView2.Navigate((urlstr))
        Catch
            installruntime()
        End Try
    End Function

界面布局

有问题之处欢迎指正

个人博客:VB.NET Edge webview2 引入-IT涉猎者

未经允许不得转载:https://blog.lxfamn.cn/?p=6698


上一篇:如何刷新当前的页面
下一篇:飞机大战