Я переношу свой сервер Blazor с .NET 7 на 8. Очевидно, это вызывает ошибку при вызове функции таким образом:
<input type = "checkbox" class = "form-check" checked = "@isChecked"
@onchange = "@((e) => AddRemoveSelection((int)i.Id!, Convert.ToBoolean(e.Value)))" />
Компилятор говорит
Не удалось определить тип делегата
и выделил функцию стрелки => красной подчеркиванием.
Вот метод:
private void AddRemoveSelection(int id, bool isSelected)
{
if (isSelected)
{
// Adding ids to selection
if (!selectedIds.Any(s => s == id))
{
selectedIds.Add(id);
}
}
else
{
var s = selectedIds.Find(s => s == id);
selectedIds.Remove(s);
}
}
Есть ли какие-либо изменения в Blazor на .NET 8, отключающие этот синтаксис?
Это нормально. Проверка генерируется из DTO со значениями по умолчанию, поэтому она никогда не пойдет не так, как пропущенные значения и т. д. Я обнаружил, что это самый простой способ реализовать взаимодействие элементов управления. Вы можете просто проверить идентификатор, поставив точку останова, я не понимаю, зачем из-за этого поднимать такой шум.





Я не могу сгенерировать ошибку с помощью кода, который вы показываете.
Обычной проблемой, когда вы видите это, является то, что компилятор IDE/Razor запутался. Я считаю, что перезапуск решения обычно исправляет проблему. Перемещение файлов за пределы IDE (скажем, с помощью файлового менеджера) также часто работает.
Вот мой MRE, основанный на вашем коде. Я добавил переработанную версию ввода и метода, которая переносит все преобразования типов в метод.
@page "/"
<PageTitle>Home</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<input type = "checkbox" class = "form-check" checked = "@isChecked"
@onchange = "@((e) => AddRemoveSelection((int)i.Id!, Convert.ToBoolean(e.Value)))" />
<input type = "checkbox" class = "form-check" checked = "@isChecked"
@onchange = "e => AddRemoveSelection1(i.Id, e)" />
@code{
private bool isChecked;
private Data i = new();
private void AddRemoveSelection(int id, bool isSelected)
{
// Do something
}
// Alternative method
// let the method do the type conversion work
private void AddRemoveSelection1(object? id, ChangeEventArgs e)
{
//do int convertion
if (!bool.TryParse(e.Value?.ToString(), out isChecked))
isChecked = false;
// Do something
}
public class Data
{
public int Id { get; set; }
}
}
По-видимому, эта ошибка возникает только для компонентов (*.razor) за пределами папки компонентов Blazor 8 по умолчанию (Страницы>Компоненты). Когда я перенес эти файлы в папку, проблема была решена вместе с некоторыми исправлениями ссылок.
Надеюсь, это поможет тем, кто столкнется с той же проблемой во время миграции.
Это неправда. Проблема в том, что компилятор IDE/SDK/Razor запутывается. Перезапуск решения обычно исправляет проблему. Перемещение файлов за пределы IDE также часто работает. Попытаемся переместить файлы еще раз.
@MrCakaShaunCurtis Я попробовал перезапустить IDE, но это не помогло. Только когда я переместил файлы в папку «Компоненты», IDE может указать на некоторые ошибки ссылок («использование» из структуры .NET 7). Без перемещения их в папку IDE не сможет обнаружить реальные проблемы.
Пробовали ли вы переместить файлы за пределы файловой структуры компонентов.
@MrCakaShaunCurtis Нет. Возможно, вы правы, это компилятор Razor вышел из строя. Так случилось и с другим проектом. Это было вызвано неправильной ссылкой на пространство имен.
@MrCakaShaunCurtis, можете ли вы записать ответ вместе с некоторыми пояснениями относительно того, что компиляторы IDE/SDK/Razor взорвались? Я отмечу это как ответ.
Я обновил свой первоначальный ответ.
Используйте правильную функцию вместо того, чтобы пытаться поместить все в строку. Гораздо проще писать, читать, отлаживать и поддерживать. Как вы теперь будете проверять удостоверение личности и
e.Value, если произойдет что-то неожиданное? Например, этоConvert.ToBooleanрано или поздно вызовет проблемы. Или вы можете найти лучший способ привязать флажок к свойству с множественным выбором.