使用 JSInterop 将对象传递给 JavaScript 会产生空对象

gal*_*len 4 javascript c# typescript asp.net-core blazor

在 ASP.Net Core 中,我尝试从 C# 代码构建 Google 地图的基本绑定。使用 JSInterop,我可以成功地将字符串传递给 JavaScript 函数,但是当我尝试传递更复杂的对象时,该对象在 JavaScript 函数中显示为空。

我部分遵循了本教程,并将其修改为使用 Google 地图而不是 Bing 地图。

正如在教程中一样,我找到了Google 地图的TypeScript 定义来帮助对绑定进行编码。

我有以下 razor 文件,当用户单击按钮时应加载地图:

@page "/sitemapper"
@inherits SiteMapperBase

<h3>Map</h3>

<div id="map" style="position: relative; width: 100%; height: 70vh;"></div>

<button class="btn btn-primary" @onclick="@OpenMap">Click me</button>

@code {
void OpenMap()
{
    LoadMap();
}
}
Run Code Online (Sandbox Code Playgroud)

对应的.razor.cs文件有如下LoadMap方法:

        protected async Task LoadMap()
        {
            LatLng center = new LatLng(40.417268, -3.696050);
            MapOptions options = new MapOptions("map", center, 8);
            await JSRuntime.InvokeAsync<Task>("loadMap", options);
        }
Run Code Online (Sandbox Code Playgroud)

上述代码中的C#类定义如下:

public class MapOptions
    {
        public string elementId;
        public LatLng center;
        public int zoom;

        public MapOptions(string elementId, LatLng center, int zoom)
        {
            this.elementId = elementId;
            this.center = center;
            this.zoom = zoom;
        }
    }

    public class LatLng
    {
        public double lat;
        public double lng;

        public LatLng(double latitude, double longitude)
        {
            lat = latitude;
            lng = longitude;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在 JavaScript/TypeScript 方面,我定义了以下接口,它们与 C# 类相匹配:

interface GoogleMapOptionsInterface {
    center: GoogleMapLatLngInterface,
    zoom: number,
    elementId: string
}

interface GoogleMapLatLngInterface {
    lat: number,
    lng: number
}
Run Code Online (Sandbox Code Playgroud)

最后,我有一个 GoogleTsInterop.ts 文件,其中包含我的 TypeScript 代码:

/// <reference path="types/index.d.ts" />
/// <reference path="interfaces/GoogleMapsInterfaces.ts" />

let googleMap: GoogleMap;

class GoogleMap {
    map: google.maps.Map;

    constructor(options: GoogleMapOptionsInterface) {
        console.log("constructor");
        var mapElement = document.getElementById(options.elementId);
        this.map = new google.maps.Map(mapElement, {
            center: options.center,
            zoom: options.zoom
        });
    }
}

function loadMap(options: GoogleMapOptionsInterface) {
    new GoogleMap(options);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,地图不会加载,并且在浏览器调试器中查看显示函数options中的对象loadMap(...)是一个空对象(参见屏幕截图)(抱歉,我没有足够的声誉来直接将图像放入)。

如果我更改代码,我可以成功传递包含以下内容的字符串:await JSRuntime.InvokeAsync<Task>("loadMap", "test");。但是我想传递该对象。

有没有办法做到这一点?我究竟做错了什么?谢谢

Vog*_* T. 5

您可以将其作为 JsonResult 或 JSON 字符串传递吗?

MapOptions options = new MapOptions("map", center, 8);
JSRuntime.InvokeAsync<Task>("loadMap", Json(options));
Run Code Online (Sandbox Code Playgroud)

或者

MapOptions options = new MapOptions("map", center, 8);
var result = new JavaScriptSerializer().Serialize(options);
JSRuntime.InvokeAsync<Task>("loadMap", result);
Run Code Online (Sandbox Code Playgroud)

  • NewtonsoftJson 或任何其他将对象转换为 Json 格式的库 (2认同)