首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ASP.NET MVC 2:模型验证-用户名已被占用?

ASP.NET MVC 2:模型验证-用户名已被占用?
EN

Stack Overflow用户
提问于 2012-05-11 18:33:16
回答 2查看 2.1K关注 0票数 2

我正在关注Scott Gu的博客:here

在他的博客中,他谈到了客户端和服务器端的验证。

如何验证用户名是否已被获取,并将其作为验证错误消息显示给用户?

在斯科特的博客中,这与验证Title是否唯一是相同的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Dinner
{
    public int DinnerID { get; set; }

    [Required(ErrorMessage = "Please enter a Dinner Title")]
    [StringLength(20, ErrorMessage = "Title is too long")]
    public string Title { get; set; }

    [Required(ErrorMessage = "Please enter the Date of the Dinner")]
    public DateTime EventDate { get; set; }

    [Required(ErrorMessage = "Please enter the location of the Dinner")]
    [StringLength(30, ErrorMessage = "Address is too long")]
    public string Address { get; set; }

    [Required(ErrorMessage = "Please enter your email address")]
    [RegularExpression(".+\\@.+\\..+", ErrorMessage = "Please enter a valid email address")]
    public string HostedBy { get; set; }

    public virtual ICollection<RSVP> RSVPs { get; set; }
}

我的第一个猜测是,不知何故,这是在Model Controller中完成的,这里:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //
    // POST: /Home/Create

    [HttpPost]
    public ActionResult Create(Dinner dinner) 
    {
        if (ModelState.IsValid) 
        {
            nerdDinners.Dinners.Add(dinner);
            nerdDinners.SaveChanges();

            return RedirectToAction("Index");
        }

        return View(dinner);
    }

因为Title存储在数据库服务器中,所以这将是服务器端验证。

我知道如何检查Title是否是唯一的,但我不知道如何使验证消息像使用[Required][StringLength()]这样的声明那样出现在视图中。例如,下面是我检查唯一性的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [HttpPost]
    public ActionResult Create(Dinner dinner) 
    {
        if (ModelState.IsValid) 
        {
            foreach (var existingDinner in nerdDinners.Dinners)
            {
                if(existingDinner.Title == dinner.Title)
                {
                    **// TODO: display validation error message?**
                }

            }

            nerdDinners.Dinners.Add(dinner);
            nerdDinners.SaveChanges();

            return RedirectToAction("Index");
        }

        return View(dinner);
    }

使用我的想象力和魔术棒,我想创建一个名为[TitleIsUnique]的新声明式,它的功能与其他验证声明式一样。

提前感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-12 12:20:31

您可以创建一个如上所述的自定义属性并使用IValidateObject,但我更喜欢将错误添加到应用程序中某一层的ModelState中。

为此,您可以使用ModelState.AddModelError

如果您使用ModelState.AddModelError("Title", "Title must be unique");,它会在Title字段中添加一个错误。

如果您使用ModelState.AddModelError("*", "Title must be unique");,它将为页面添加一条常规错误消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  [HttpPost]
  public ActionResult Create(Dinner dinner) 
  {
      if (ModelState.IsValid) 
      {
          if(nerdDinners.Dinners.Any(d => d.Title == dinner.Title))
          {
              ModelState.AddModelError("Title", "The title is not unique");
              return View(dinner);
          }

          nerdDinners.Dinners.Add(dinner);
          nerdDinners.SaveChanges();

          return RedirectToAction("Index");
      }

      return View(dinner);
  }
票数 3
EN

Stack Overflow用户

发布于 2012-05-12 05:32:40

您可能正在考虑实现自己的从CustomAttribute派生的属性。看看这篇博文http://blogs.msdn.com/b/adonet/archive/2011/05/27/ef-4-1-validation.aspx -它展示了如何验证唯一性。在post中,IValidatableObject接口用于执行验证,但是您应该能够通过创建CustomAttribute来执行验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10556767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文