You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET MVC视图调用模型属性异常及表单验证问题求助

解决ASP.NET MVC视图中的模型属性与验证问题

我来帮你逐一拆解并解决这两个视图里的问题:


一、Create.cshtml 验证异常问题

问题根源

你的验证信息无法正常显示,主要是两个关键点导致的:

  1. @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 里的true参数表示只显示模型级别的全局错误,会屏蔽所有属性级别的验证提示;当保留项目组代码时,模型绑定过程中可能产生了属性级错误,但被这个设置隐藏了。
  2. 若你需要强制用户选择至少一个项目,当前的EmployeeViewModel没有对应的验证规则,同时列表绑定的异常可能干扰了整个模型验证体系的正常输出。

解决方案

  1. 调整ValidationSummary显示所有错误
    把ValidationSummary的第一个参数改为false,这样就能展示所有属性和模型级别的错误信息:

    @Html.ValidationSummary(false, "", new { @class = "text-danger" })
    
  2. 添加项目选择的自定义验证(可选但推荐)
    如果要求必须选择至少一个项目,给EmployeeViewModel实现IValidatableObject接口来添加自定义验证逻辑:

    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    
    namespace App.Data.Models {
        public class EmployeeViewModel : IValidatableObject {
            public Employee Employee { get; set; }
            public List<Project> Project { get; set; }
    
            public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
                if (Project?.Any(p => p.isSelected) != true) {
                    yield return new ValidationResult("请至少选择一个项目", new[] { nameof(Project) });
                }
            }
        }
    }
    

    这样当用户未选择任何项目时,@Html.ValidationMessageFor(model => model.Project)就会正确显示错误提示。

  3. 确保GET请求时Project列表已初始化
    在Controller的Create GET方法里,提前初始化Project列表,避免空引用异常:

    public ActionResult Create() {
        var viewModel = new EmployeeViewModel {
            Project = Enum.GetValues(typeof(ProjectType))
                .Cast<ProjectType>()
                .Select(type => new Project { ProjectType = type })
                .ToList()
        };
        return View(viewModel);
    }
    

二、Details.cshtml 属性调用与展示问题

问题根源

  1. @Model.Employee.LastName失效、ActionLink传参失败,核心原因是Controller的Details方法没有正确给EmployeeViewModelEmployeeProject属性赋值,导致这些属性为null
  2. 直接用@Html.DisplayFor(model => model.Project)无法展示选中项目,因为它是列表类型,默认模板只会显示类名,需要手动筛选并渲染选中项。

解决方案

  1. 修复Controller的Details方法
    确保在Details方法中,从数据库获取完整的Employee和关联的选中项目数据,填充到ViewModel:

    public ActionResult Details(int id) {
        // 从数据库获取员工信息
        var employee = db.Employees.Find(id);
        if (employee == null) {
            return HttpNotFound();
        }
    
        // 获取该员工的选中项目(这里假设你有存储选中项目的关联逻辑)
        var selectedProjects = db.Projects
            .Where(p => p.EmployeeId == id && p.isSelected)
            .ToList();
    
        var viewModel = new EmployeeViewModel {
            Employee = employee,
            Project = selectedProjects
        };
    
        return View(viewModel);
    }
    
  2. 正确展示选中的项目
    替换视图中原来的Project展示代码,手动筛选并渲染选中的项目:

    <dt>
        已选项目
    </dt>
    <dd>
        @if (Model.Project?.Any() == true) {
            <ul>
                @foreach (var project in Model.Project) {
                    <li>@project.ProjectType</li>
                }
            </ul>
        } else {
            <span>未选择任何项目</span>
        }
    </dd>
    
  3. 修复ActionLink的Id传递
    确认Model.Employee.Id有值后,修正ActionLink的写法(去掉多余的注释符号):

    @Html.ActionLink("Edit", "Edit", new { id = Model.Employee.Id }) |
    @Html.ActionLink("Back to List", "Index")
    

内容的提问来源于stack exchange,提问作者izulaa5

火山引擎 最新活动