【问题标题】:How can I make my ModelState be valid with empty fields?如何使我的 ModelState 对空字段有效?
【发布时间】:2020-03-03 00:33:59
【问题描述】:

我的页面上有 3 行用于成就输入。 即使仅填充了 1 行,我也希望 ViewModel 状态有效。 现在模型状态仅在我填满所有 3 行时才有效。

我必须为此创建多个构造函数吗?

    public int AchievementsRank1 { get; set; }
    public string AchievementsEvent1 { get; set; }

    public int AchievementsRank2 { get; set; }
    public string AchievementsEvent2 { get; set; }

    public int AchievementsRank3 { get; set; }
    public string AchievementsEvent3 { get; set; }

    public EditProfileViewModel()
    {

    }

    public EditProfileViewModel(string username, int achievementsR1, string achievementsE1, int achievementsR2, string achievementsE2, int achievementsR3, string achievementsE3, string freetext, string social)
    {
        this.Username = username;
        this.AchievementsRank1 = achievementsR1;
        this.AchievementsEvent1 = achievementsE1;
        this.AchievementsRank2 = achievementsR2;
        this.AchievementsEvent2 = achievementsE2;
        this.AchievementsRank3 = achievementsR3;
        this.AchievementsEvent3 = achievementsE3;
        this.Freetext = freetext;
        this.SocialURL = social;
    }
    [ValidateAntiForgeryToken]
    public IActionResult Index([Bind("Username,AchievementsRank1,AchievementsEvent1,AchievementsRank2,AchievementsEvent2,AchievementsRank3,AchievementsEvent3,Freetext,SocialURL")] EditProfileViewModel edit)
    {
        if (ModelState.IsValid)
        {
            ProfileDTO dto = CreateDtoFromInput(edit);
            //commands.SaveNewProfile(dto);
            Profile prof = new Profile(dto);
            return View("Profile", prof);
        }
        else
        {
            return View(edit);
        }
    }

【问题讨论】:

  • 我建议使用键值对而不是单独使用字段
  • 在模型类中实现IValidatableObject,根据您的需求返回自定义错误列表。

标签: c# asp.net asp.net-mvc viewmodel modelstate


【解决方案1】:

ViewModel 验证通常集中在 1 个属性上。

您可以创建自定义注释并“组合”多个属性并创建自己的验证规则。如您所见,这种方法使用注释而不是bind(

我也会建议把很多属性改成一个对象作为ViewModel,这样看起来会更干净。

public class Movie
{
    public int Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Title { get; set; }

    [CustomAnnotation(x,y,z)]
    [StringLength(1000)]
    public string Description { get; set; }

    [Range(0, 999.99)]
    public decimal Price { get; set; }

    [Required]
    public Genre Genre { get; set; }

    public bool Preorder { get; set; }
}

在此处查看示例 https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-3.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多