.net Blazor错误:JS Interop的JSON初始化问题

fsi0uk1n  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(102)

各位开发者好,
我的Blazor组件遇到了一个涉及JavaScript互操作的问题。具体来说,当尝试在JavaScript中获取对表体的引用并处理其行时,我遇到了JSON格式化错误。错误消息表明,从JavaScript接收的JSON值无法转换为Microsoft.JSInterop.IJSObjectReference[]。我已经包含了Blazor组件和JavaScript代码的相关部分。
有没有其他人遇到过类似的问题,或者可以提供有关导致此问题的原因的见解?我感谢您在解决此JSON转换挑战方面的任何帮助或指导。提前感谢您的专业知识!

**请注意:**我在一个Razor类库中工作,该类库被Blazor服务器应用程序和MAUI Blazor应用程序引用。未引用JavaScript代码,只是为了测试我是否获得任何值,我正在使用javascript代码。我想将数据插入SQL表中,但无法这样做。

  1. <tbody id="table-body">
  2. <!-- Rows will be added here dynamically -->
  3. @for (int index = 0; index < Items.Count; index++)
  4. {
  5. var item = Items[index];
  6. <tr>
  7. <td>
  8. <div style="display: flex; align-items: center;">
  9. <input type="checkbox" class="me-1" @bind="item.Selected" />
  10. @(index + 1)
  11. <button class="ms-2 btn btn-sm btn-danger" @onclick:preventDefault @onclick="() => DeleteRow(index)" style="display: @(item.Selected ? "block" : "none")">Delete</button>
  12. </div>
  13. </td>
  14. <td><input type="text" class="form-control" @bind="item.Name" /></td>
  15. <td><input type="text" class="form-control" @bind="item.Quantity" /></td>
  16. <td>
  17. <input type="text" list="uomOptions" class="form-control" @bind="item.UOM" />
  18. <datalist id="uomOptions">
  19. <option value="Piece"></option>
  20. <option value="Each"></option>
  21. <option value="Box"></option>
  22. <!-- Add more UOM options as needed -->
  23. </datalist>
  24. </td>
  25. <td>
  26. <input type="date" class="form-control" @bind="item.RequiredBy" min="@DateTime.Now.ToString("dd-MM-yyyy")" />
  27. </td>
  28. </tr>
  29. }
  30. </tbody>

x

  1. <div class="col-12">
  2. <button class="btn btn-primary rounded-pill" @onclick="AddRow">Add Row</button>
  3. <button class="btn btn-primary rounded-pill" @onclick="StoreAndCallCSharpMethod">Get Data</button>
  4. </div>
  1. <script defer>
  2. // JavaScript method to store values in an array and log to console
  3. function storeAndCallCSharpMethod() {
  4. var dataArray = [];
  5. // Loop through each dynamically added row
  6. var tableBody = document.getElementById('table-body');
  7. var rows = tableBody.getElementsByTagName('tr');
  8. for (var i = 0; i < rows.length; i++) {
  9. var row = rows[i];
  10. var inputs = row.getElementsByTagName('input');
  11. // Get values from input fields
  12. var name = inputs[1].value;
  13. var quantity = inputs[2].value;
  14. var uom = inputs[3].value;
  15. var requiredBy = inputs[4].value;
  16. // Store values in an object
  17. var rowData = {
  18. Name: name,
  19. Quantity: quantity,
  20. UOM: uom,
  21. RequiredBy: requiredBy
  22. };
  23. // Add the object to the array
  24. dataArray.push(rowData);
  25. }
  26. // Log the array to the console
  27. console.log(dataArray);
  28. }
  29. </script>
  1. @code {
  2. List<Item> dataArray = new List<Item>();
  3. public async Task GetAndLogTableData()
  4. {
  5. // Get table body from JS
  6. var tableBody = await JSRuntime.InvokeAsync<IJSObjectReference>("eval", "document.getElementById('table-body')");
  7. // Get all rows
  8. var rows = await tableBody.InvokeAsync<IJSObjectReference[]>("querySelectorAll", "tr");
  9. foreach (var row in rows)
  10. {
  11. // Get input fields within the current row
  12. var inputs = await row.InvokeAsync<IJSObjectReference[]>("querySelectorAll", "input");
  13. // Map to RowData object
  14. var rowData = new Item
  15. {
  16. Name = await inputs[1].InvokeAsync<string>("value"),
  17. Quantity = await inputs[2].InvokeAsync<string>("value"),
  18. UOM = await inputs[3].InvokeAsync<string>("value"),
  19. RequiredBy = await inputs[4].InvokeAsync<DateTime>("value") // Assuming RequiredBy is a string, adjust accordingly
  20. };
  21. // Add to list
  22. dataArray.Add(rowData);
  23. }
  24. foreach (var data in dataArray)
  25. {
  26. await insert.PRInsert(data.Name, data.Quantity, data.UOM, data.RequiredBy);
  27. Console.WriteLine($"{data.Name}, {data.Quantity}, {data.UOM}, {data.RequiredBy}");
  28. }
  29. }
  30. }

的数据

使用下面的方法会显示与长度相关的错误:Microsoft.JSInterop.JSException:Could not find 'get'('get' was undefined).我尝试了不同的方法,但都无效

  1. private async Task StoreAndCallCSharpMethod()
  2. {
  3. var tableBody = await JSRuntime.InvokeAsync<IJSObjectReference>("eval", "document.getElementById('table-body')");
  4. var rows = await tableBody.InvokeAsync<IJSObjectReference>("getElementsByTagName", "tr");
  5. for (int i = 0; i < await rows.InvokeAsync<int>("get", "length"); i++)
  6. {
  7. var row = await rows.InvokeAsync<IJSObjectReference>("get", i);
  8. var inputs = await row.InvokeAsync<IJSObjectReference>("getElementsByTagName", "input");
  9. var name = await inputs.InvokeAsync<string>("get", 1, "value");
  10. var quantity = await inputs.InvokeAsync<string>("get", 2, "value");
  11. var uom = await inputs.InvokeAsync<string>("get", 3, "value");
  12. var requiredBy = await inputs.InvokeAsync<string>("get", 4, "value");
  13. var rowData = new Item
  14. {
  15. Name = name,
  16. Quantity = quantity,
  17. UOM = uom,
  18. RequiredBy = DateTime.Parse(requiredBy)
  19. };
  20. dataArray.Add(rowData);
  21. }
  22. // Log the list to the console
  23. Console.WriteLine("Logging from C#:");
  24. foreach (var data in dataArray)
  25. {
  26. Console.WriteLine($"{data.Name}, {data.Quantity}, {data.UOM}, {data.RequiredBy}");
  27. }
  28. }

任何对我遇到的各种错误感兴趣的人都可以参考下面的ChatGPT聊天Chat

a9wyjsp7

a9wyjsp71#

根据你的代码,我可以让它在我这边工作。
你可以参考以下代码:

  1. async Task StoreAndCallCSharpMethod()
  2. {
  3. var dataArray = await JSRuntime.InvokeAsync<List<RowData>>("storeAndCallCSharpMethod");
  4. // Log the list to the console
  5. Console.WriteLine("Logging from C#:");
  6. // foreach (var data in dataArray)
  7. // {
  8. // Console.WriteLine($"{data.Name}, {data.Quantity}, {data.UOM}, {data.RequiredBy}");
  9. // }
  10. }

字符串
script如下:

  1. <script src="_framework/blazor.server.js"></script>
  2. <script defer >
  3. // JavaScript method to store values in an array and log to console
  4. function storeAndCallCSharpMethod() {
  5. var dataArray = [];
  6. // Loop through each dynamically added row
  7. var tableBody = document.getElementById('table-body');
  8. var rows = tableBody.getElementsByTagName('tr');
  9. for (var i = 0; i < rows.length; i++) {
  10. var row = rows[i];
  11. var inputs = row.getElementsByTagName('input');
  12. // Get values from input fields
  13. var name = inputs[1].value;
  14. var quantity = inputs[2].value;
  15. var uom = inputs[3].value;
  16. var requiredBy = inputs[4].value;
  17. // Store values in an object
  18. var rowData = {
  19. Name: name,
  20. Quantity: quantity,
  21. UOM: uom,
  22. RequiredBy: requiredBy
  23. };
  24. // Add the object to the array
  25. dataArray.push(rowData);
  26. }
  27. // Log the array to the console
  28. console.log(dataArray);
  29. return dataArray;
  30. }
  31. </script>

展开查看全部

相关问题