C# 如何使相关对象成为必需的?

C# 如何使相关对象成为必需的?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我将MVC5与EntityFramework一起使用,似乎无法使用数据注释将相关对象的选择作为必填字段 我的模型很简单。这是我的Movement.cs模型: public class Movement { [Key] public int MovementID { get; set; } [Required(ErrorMessage = "Type is required.")] [MaxLength(50, ErrorMessage = "Type canno

我将MVC5与EntityFramework一起使用,似乎无法使用数据注释将相关对象的选择作为必填字段

我的模型很简单。这是我的Movement.cs模型:

public class Movement
{
    [Key]
    public int MovementID { get; set; }

    [Required(ErrorMessage = "Type is required.")]
    [MaxLength(50, ErrorMessage = "Type cannot be longer than 50 characters.")]
    public string Type { get; set; }

    [Required(ErrorMessage = "Persons name is required.")]
    public virtual Person Name { get; set; }

    [Required(ErrorMessage = "Location is required.")]
    public virtual Location Location { get; set; }

}
这个运动有两个相关的实体,人和地点,这是非常简单的移动。在“创建运动”窗体中,我使用以下ViewModel:

public class MovementFormViewModel
{
    public Movement Movement { get; set; }
    public IEnumerable<SelectListItem> Types { get; set; }

    public int? SelectedLocation { get; set; }
    public int? SelectedPerson { get; set; }

}
最后,对于我的相关实体,“创建视图”具有以下功能:

            @Html.DropDownListFor(
                x => x.SelectedPerson,
                Model.People,
                "-- Select a Person --")

            <p class="text-error">
                @Html.ValidationMessageFor(model => model.MarketMovement.Name)
            </p>
如果我提交表单,那么我会得到验证错误,我的人员和位置字段是必需的。。。但是,当我从下拉列表中选择一个条目并尝试重新提交时,表单仍然会引发一个验证,即这些条目是必需的,我无法继续


我做错了什么?

提交时,您的模型中是否实际设置了所选人员? 对于同一个任务,我创建了SelectedPersonID并将其标记为所需


如本文所述

首先,不建议在非基本类型上设置DataAnnotation,如下所示:

[Required(ErrorMessage = "Persons name is required.")]
public virtual Person Name { get; set; }

[Required(ErrorMessage = "Location is required.")]
public virtual Location Location { get; set; }
更重要的是,您的Name属性不是Name,而是整个Person对象

通常,主要问题在于,当您选择一个项目时,它不会绑定到您的MovementFormViewModel.Movement.Person,但它只是设置MovementFormViewModel.SelectedPerson。因此MovementFormViewModel.Movement.Person将保持为空,并发生验证错误

因此,我建议从Movement类中删除Required属性,因为它似乎没有被使用。您应该将验证移到视图模型类:

public class MovementFormViewModel
{
    public Movement Movement { get; set; }
    public IEnumerable<SelectListItem> Types { get; set; }

    [Required(ErrorMessage = "Location is required.")]
    public int SelectedLocation { get; set; }
    [Required(ErrorMessage = "Persons name is required.")]
    public int SelectedPerson { get; set; }

}

如上所述,您不能使用可为null的int?,您应该使用不可为null的int来适当地进行验证工作

是的,如果我移除[Required]标签,它会正常工作。如果我将[Required]标记移到ViewModel中的SelectedPerson和SelectedLocation属性,则验证不会触发OK,这很有意义,谢谢。但是如果我将[Required]标记移动到ViewModel中的SelectedPerson和SelectedLocation属性,那么验证不会触发,将nullable更改为是修复它的另一部分,谢谢!
public class MovementFormViewModel
{
    public Movement Movement { get; set; }
    public IEnumerable<SelectListItem> Types { get; set; }

    [Required(ErrorMessage = "Location is required.")]
    public int SelectedLocation { get; set; }
    [Required(ErrorMessage = "Persons name is required.")]
    public int SelectedPerson { get; set; }

}