惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
博客园_首页
Google DeepMind News
Google DeepMind News
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
B
Blog RSS Feed
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
量子位
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
有赞技术团队
有赞技术团队
Jina AI
Jina AI
GbyAI
GbyAI

博客园 - hrx521

微信公众号H5开发踩坑记:为什么POST返回的页面会显示HTML源码 SQL NOT IN 子查询存在 NULL 的经典行为陷阱--NULL 三值逻辑(TRUE / FALSE / UNKNOWN) SQL用窗口函数做逐行累计的实用用例 我的蝶翼斑马鱼繁殖要领总结 如何从操作系统的角度,理解C#语言的Async Await 异步机制内部状态机的运行原理? C#扩展方法对软件工程构建的促进示例和总结 基于原数据库新创建一个带部分数据做为初始数据的数据库的思路 sql调优记录,不要在join on 条件中使用过多的条件 发布和更新自己的nuget包 Rust的枚举类型Enum Rust语言特色语法记录 Rustup-init.exe安装后执行cargo run 报错:`link.exe` returned an unexpected error的解决办法 FastReport.OpenSource .Net下开源免费报表打印组件 SQL使用Merge在一个语句中完成插入、更新和删除操作 IIS应用程序回收导致应用中Hangfire等后台任务无法正常启动工作的解决方法 Microsoft.AspNetCore.Identity 的使用记录 C# xml文档反序列化记事 债券与债券基金 Linq补充学习 Blazor学习记录_12._IIS部署_组件的引用_HTML元素的引用 Blazor学习记录_11.身份认证与授权 Blazor学习记录_9.预呈现_渲染树
Blazor学习记录_10.C#和JS互操作_访问WEB API
hrx521 · 2024-03-31 · via 博客园 - hrx521

23.C#和JS互操作

23.1 C#调用JS,使用IJSRuntime

js代码:
<button onclick="javascript:alter("提示信息")">点我弹出提示</button>
C#调用JS:JsInteractive.razor页面代码,InvokeVoidAsync()方法和InvokeAsync() 方法

@Page "/jsinteractive"
<button @onclick="ShowAlter">点我弹出提示</button>
<button @onclick="Prompt">点我弹出框</button>
您输入的姓名是:@Value

@inject IJSRuntime JS
@code
{
string? Value{get;set;}
async Task ShowAlert()
    {
        await JS.InvokeVoidAsync("alert","提示信息");
    }
async Task Prompt()
    {
       Value = await JS.InvokeAsync<string>("prompt","请输入姓名");
    }
}

23.2 JS调用C#的方法一(不推荐),JS调用C#静态方法

  • 1.要求C#方法必须是静态方法
  • 2.必须在静态方法上打上[JSInvokable]特性标签
  • 3.在js中使用静态对象DotNet,同步方法使用DotNet.invokeMethod('C#程序集','方法名','参数1','参数2'...) ;异步方法使用DotNet.invokeMethodAsync('C#程序集','方法名','参数1','参数2'...)

23.3 JS调用C#的方法二(推荐),JS调用C#实例方法

  • 1.方法是public
  • 2.必须在方法上打上[JSInvokable]特性标签
  • 3.用C#代码转写一个方法
    包含将来要被js调用的方法Add()和AddAsync()的C#类 JsFunc
public class JsFunc
{
    [JSInvokable]
    public int Add()
    {
        return 1+5;
    }
    [JSInvokable]
    public Task<int> AddAsync()
    {
        return Task.FromResult(1+5);
    }
}

做转写,JsInteractive.razor

@Page "/js"
<button @onclick="Add">Add</button>
<button @onclick="AddAsync">AddAsync</button>
@Inject IJSRuntime JS
@code
{
    async Task Add()
    {
        var js = DotNetObjectReference.Create(new JsFunc());
        await JS.InvokeVoidAsync("add",js);
    }
    async Task AddAsync()
    {
        var js = DotNetObjectReference.Create(new JsFunc());
        await JS.InvokeVoidAsync("addAsync",js);
    }
}

js 调用方 app.js

function add(dotNet)
{
    let result = dtonet.invikeMethod('Add');
    console.log(result);
}
function addAsync(dotNet)
{
    let result = dtonet.invikeMethodAsync('AddAsync');
    console.log(result);
}

24. 访问WEB API

  • 1.注册 HttpClient 服务
    builder.Services.AddScoped(new HttpClient{BaseAddress="http://localhost:7008"});
    有时要注册跨域服务:
    builder.Services.AddCors(options=>options.AddPolicy("any",builder=>builder.AllowAnyOrigin().AllowAnyHeader().AddlowAnyMethod()));
    跨域还需启用跨域中间件:
    app.UseCors("any");
  • 2.在要使用HttpClient的razor页面依赖注入httpClient实例
    @inject HttpClient httpClient
  • 3.调用http crud方法
IEnumberable<WeatherForCast>? Data{get;set;} = [];
async Task GetDataAsync()
{
	Data = awiat httpClient.GetFromJsonAsync<IEnumberable<WeatherForCast>>("weatherforecast");
}
  • 说明
    以上注册和注入工作,适用于webassembly或auto呈现方式型项目,当是auto型时要将HttpClient服务注册写在用项目模版自动创建的两个项目中的Client项目中。
    如果是Server呈现模式,直接可以使用服务器端的HttpClient