JavaScript Interop - CallingJavaScript 2/2
2022. 4. 27. 00:00ㆍASPNET/Blazor
반응형
JavaScript 함수에 data 전달
IJSRuntime 의 InvokeAsync 및 InvokeVoidAsync 둘다 매개변수를 전달할 수 있다.
아래 파일을 생성 한다.
wwwroot/js/callByModule.js
export function callWithPrimtiveParameters(data1, data2, data3) {
alert(`Received: data1 ${data1}, data2 ${data2}, data3 ${data3}`);
}
Pages/CallWithParameter.razor
@page "/call/pass-parameter-javascript-function"
@inject IJSRuntime JS
@implements IAsyncDisposable
<button @onclick="CallFunction">pass parameter to function</button>
@code {
private Lazy<IJSObjectReference> Module = new();
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
Module = new(await JS.InvokeAsync<IJSObjectReference>("import","./js/callByModule.js"));
}
}
public async Task CallFunction()
{
await Module.Value.InvokeVoidAsync("callWithPrimtiveParameters", "나야나", 1234, DateTime.Now);
}
public async ValueTask DisposeAsync()
{
await Module.Value.DisposeAsync();
}
}
실행
공통개체 생성
Data/CSharpObject.cs
using Microsoft.JSInterop;
namespace BlazorTutorial.Data;
public class CSharpObject
{
public string Name { get; set; } = "";
public int Age { get; set; }
public DateTime BirthDate { get; set; }
[JSInvokable]
public void VoidMethod() => Name = $"{nameof(VoidMethod)} called";
}
wwwroot/callByModule.js
export function callWithPrimtiveParameters(data1, data2, data3) {
alert(`Received: data1 ${data1}, data2 ${data2}, data3 ${data3}`);
}
export function callWithReferenceParameter(csharpObjectReference) {
alert(`Received object not null? - ${csharpObjectReference != null}`);
}
export function callWithObjectParameter(csharpObject) {
alert(`Received object data: name ${csharpObject.name}, age ${csharpObject.age}, birthDate ${csharpObject.birthDate}`);
}
JavaScript 함수에 개체 참조 전달
Pages/CallWithReference.razor
@page "/call/with-reference"
@using BlazorTutorial.Data
@inject IJSRuntime JS
@implements IAsyncDisposable
<button @onclick="CallFunction">pass parameter to function</button>
@code {
private Lazy<IJSObjectReference> Module = new();
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
Module = new(await JS.InvokeAsync<IJSObjectReference>("import","./js/callByModule.js"));
}
}
public async Task CallFunction()
{
var passObject = new CSharpObject()
{
Name = "나야 나",
Age = 100,
BirthDate = DateTime.Now
};
var refObject = DotNetObjectReference.Create<CSharpObject>(passObject);
await Module.Value.InvokeVoidAsync("callWithReferenceParameter", refObject);
}
public async ValueTask DisposeAsync()
{
await Module.Value.DisposeAsync();
}
}
Reference 로 CSharpObject 를 전달 하는 경우 Property 또는 member field로 javascript 가 접근 할 수 없다.
대신 function 으로의 접근은 가능 한다.
[JSInvokable]
위 attribute 가 적용된 함수는 javascript 에서 호출 할 수 있다. (이 다음 강좌에서 설명드리겠다.)
즉 javascript 에서 c# method 를 호출 할때는 위와 같이 csharp class 의 reference 를 javascript 쪽으로 전달 하여야 한다.
JavaScript 함수에 개체 데이터 전달
@page "/call/with-object"
@using BlazorTutorial.Data
@inject IJSRuntime JS
@implements IAsyncDisposable
<button @onclick="CallFunction">pass parameter to function</button>
@code {
private Lazy<IJSObjectReference> Module = new();
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
Module = new(await JS.InvokeAsync<IJSObjectReference>("import","./js/callByModule.js"));
}
}
public async Task CallFunction()
{
var passObject = new CSharpObject()
{
Name = "나야 나",
Age = 100,
BirthDate = DateTime.Now
};
await Module.Value.InvokeVoidAsync("callWithObjectParameter", passObject);
}
public async ValueTask DisposeAsync()
{
await Module.Value.DisposeAsync();
}
}
CSharpObject 에서 property 는 Name, Age, BirthDate 로 되어 있지만 javascript 로 전달되면서 json 변환과정에서 camelCase 로 변경되어 name, age, birthDate 가 된다. 참고 하자
관련영상
반응형
'ASPNET > Blazor' 카테고리의 다른 글
DynamicComponent (0) | 2022.04.29 |
---|---|
JavaScript Interop - CallingCSharpMethod (0) | 2022.04.28 |
JavaScript Interop - CallingJavaScript 1/2 (0) | 2022.04.26 |
JavaScript Interop - Add JavaScript in Blazor (0) | 2022.04.25 |
Generic Projection (0) | 2022.04.22 |