【问题标题】:C# MVC return errors per item in IList to viewC# MVC 返回 IList 中每个项目的错误以查看
【发布时间】:2015-08-18 13:40:12
【问题描述】:

假设我有以下 ViewModel:

public class EmailFromViewModel 
{
    public IList<InviteEmailAddress> InviteEmailAddress {get; set;}
}
 public class InviteEmailModel
    {
        [RegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$", ErrorMessage = "Invalid Email Address")]
        [DataType(DataType.EmailAddress)]
        [Required(ErrorMessage = "Email Address is required.")]
        public string Email { get; set; }
        [Required(ErrorMessage = "Name is required.")]
        public string Name { get; set; }
}

在我看来,我有一个 for 循环来显示姓名和电子邮件输入,以便用户可以邀请人们加入。该视图默认显示 3 个输入组(3 个名称和 3 个电子邮件),并且可以通过添加新组的按钮进行扩展。现在,当列表发布时,会通过电子邮件地址循环并处理它们。在处理时,其中一项可能会返回错误,我不希望进程停止,但我希望它只存储此错误消息并将其返回到视图,以便我可以在表单组中显示错误导致错误。 我有点迷失如何存储错误并将它们返回到视图中以呈现它们。有没有人知道如何实现这一目标?

此外,我现在所需的验证也不完美,因为如果有人只想邀请 1 个人,那么验证将针对我呈现的第二个和第三个输入组触发。我仍然需要弄清楚如何解决这个问题。

处理代码:

public async Task<ActionResult> InviteEmail(InviteViewModel inviteUser) 
{
            foreach (var i in inviteUser.InviteEmailAddresses)
            {
                var user = _userService.GetUsersByEmail(i.Email);
                if (user != null)
                {
                    if (!_userService.CanInviteUser(user.Id, i.DumpId))
                        //Dont return but save result and present to user.

                }
                if (ModelState.IsValid)
                {
                    Guid tokenId = Guid.NewGuid();
                    SecurityToken securityToken = new SecurityToken()
                    {
                        Token = tokenId
                    };
                    _securityTokenService.CreateSecurityToken(securityToken );
                    UserMailer.Invite(i.Email).Send();
                    //Dont return but save result and present to user.

                }
                else
                    //Dont return but save result and present to user.

            }
}

【问题讨论】:

  • 发布您当前的“处理”代码。
  • 完成,但有点简单。
  • 如果您只想允许一个InviteEmailAddress,那么您的初始视图应该只包含一个,然后有一个添加按钮可以选择添加更多。但是您需要展示如何动态添加新项目(我假设您将 ajax 与 BeginCollectionItem 帮助器结合使用?)
  • 还建议您使用[EmailAddress] 属性而不是您的[RegularExpression] 属性

标签: c# asp.net-mvc


【解决方案1】:

看看这个链接:http://www.asp.net/mvc/overview/older-versions-1/models-(data)/performing-simple-validation-cs

在您的 cshtml 页面上,您可以添加 Html.ValidationMessageFor 作为错误消息的占位符,在您的控制器中,您可以添加 ModelState.AddModelError 以指定要显示的错误消息。

【讨论】:

    【解决方案2】:

    为了避免在仅指定 1 或 2 个受邀者时触发验证代码,您需要从视图模型中删除所需的属性。然后在你的处理代码中发现错误时可以使用:

     ModelState.AddModelError ("key1","Some error message goes here");
    

    如果您在自定义模型绑定器中进行处理,那么您需要使用:

    bindingContext.ModelState.AddModelError(....)
    

    在您看来,您会使用

    @Html.ValidationMessage("Key1")
    

    当然诀窍是确保“Key1”可以是可以为每个重复字段计算的值(可能基于列表中字段的索引,例如“email1”、“name2”) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多