视图无法识别ViewModel并报表达式树动态操作错误求助(已用@model)
解决"An expression tree may not contain a dynamic operation"错误
我帮你梳理下问题根源,主要有三处关键错误导致了这个报错,咱们一个个来解决:
1. 视图中模型声明的语法错误
你在视图里写的是@Model ArtSite.ViewModels.UserViewModel,但正确的模型声明必须用小写的@model(注意首字母小写)!大写的@Model是用来在视图中引用模型实例的,而声明模型类型的关键字是@model。这是导致视图无法识别ViewModel、触发动态操作错误的核心原因。
修正后的视图开头:
@model ArtSite.ViewModels.UserViewModel <h2>Kayıt Sayfası</h2> <!-- 其余视图代码保持不变 -->
2. UserViewModel中Compare属性的参数错误
你的ConfirmSifre属性上的Compare特性写的是Compare("Password"),但你的密码属性名是Sifre,不是Password。这个错误会导致验证逻辑失效,同时也可能间接影响表达式树的解析。
修正后的UserViewModel代码:
namespace ArtSite.ViewModels { public class UserViewModel { [Required] public string Isim { get; set; } [Required] public string Soyad { get; set; } [Required, DataType(DataType.Date), Display(Name = "Doğum Tarihi")] public DateTime DogumTarihi { get; set; } [Required, MinLength(6), MaxLength(30), Display(Name = "Kullanıcı Adı")] public string KullaniciAdi { get; set; } [Required, DataType(DataType.Password), MinLength(6), MaxLength(30)] [Display(Name = "Şifre")] public string Sifre { get; set; } [Required, DataType(DataType.Password), MinLength(6), MaxLength(30)] // 把Compare的参数改成"Sifre",和密码属性名一致 [Compare("Sifre", ErrorMessage = "Şifreniz Uyuşmadı."), Display(Name = "Şifreyi Onayla")] public string ConfirmSifre { get; set; } } }
3. 控制器Post方法的参数不匹配
你的Post方法KayitAsync接收的是Kullanici实体,但视图绑定的是UserViewModel。这种不匹配会导致模型绑定失败,也会引发表达式树相关的错误。正确的做法是接收UserViewModel作为参数,再将其映射到Kullanici实体。
修正后的控制器Post方法:
[HttpPost] public async Task<IActionResult> KayitAsync(UserViewModel vm) { if (ModelState.IsValid) { // 将ViewModel映射到Kullanici实体 Kullanici k = new Kullanici { Isim = vm.Isim, Soyad = vm.Soyad, DogumTarihi = vm.DogumTarihi, KullaniciAdi = vm.KullaniciAdi, Sifre = vm.Sifre // 注意:实际项目中一定要对密码进行哈希加密,绝对不要存储明文! }; _context.Kullanicilar.Add(k); await _context.SaveChangesAsync(); return View("thanks"); } // 验证失败时返回原视图,并传递ViewModel保留用户输入 return View(vm); }
额外提醒:实际生产环境中,务必使用PasswordHasher<T>对密码进行哈希处理后再存入数据库,避免明文存储带来的安全风险。
把这三处错误修正后,视图就能正确识别ViewModel,那个表达式树的错误也会消失啦。
内容的提问来源于stack exchange,提问作者Ensar Eray
相关产品推荐
相关产品推荐

