You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

视图无法识别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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:41:12