加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何处理ASP.Net MVC中的Model和ViewModel验证

发布时间:2020-12-16 09:54:19 所属栏目:asp.Net 来源:网络整理
导读:我有一个包含Model和ViewModel的ASP.Net MVC应用程序,这个应用程序有UI和API接口,可以通过不同的控制器工作,UI与ViewModel一起工作,API与Model一起工作. ViewModel对数据注释(C#属性)进行了验证,而Model现在没有验证API现在允许将任何不一致的模型保存到DB.
我有一个包含Model和ViewModel的ASP.Net MVC应用程序,这个应用程序有UI和API接口,可以通过不同的控制器工作,UI与ViewModel一起工作,API与Model一起工作. ViewModel对数据注释(C#属性)进行了验证,而Model现在没有验证API现在允许将任何不一致的模型保存到DB.

我现在拥有的:

// Model
public class Contact
{
    public string Email { get; set; }
    ...
}

// ViewModel
public class CreateContactViewModel
{
    [Required(ErrorMessage = "*")]
    [EmailAddress(ErrorMessageResourceType = typeof(CreateContact),ErrorMessageResourceName = "Validation_invalid_email",ErrorMessage = null)]
   public string Email { get; set; }
   ...
}

// View
...
<div style="padding-bottom:13px;">
    @Html.TextBoxFor(x => x.Email,new { style = "width:405px;" })
    @Html.ValidationMessage("Email",new { style = "color:red;" })
</div>
...

// UI controller
[HttpPost]
public ActionResult Create(CreateContactViewModel model,GetContactsViewModel contactsModel)
{           
    /* Now validation work only on client side,should be fixed? */
    var newContact = new Contact()
    {           
    Email = model.Email,...
    };

    UnitOfWork.ContactRepository.Insert(newContact);
    UnitOfWork.Save();

    return GetContactsList(contactsModel);
}

// API Controller
public class ContactsController : BaseApiController
{
    ...
    public IHttpActionResult Post(Contact contact)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        UnitOfWork.ContactRepository.Insert(contact);

        try
        {
            UnitOfWork.Save();
        }            
        catch (DbUpdateException)
        {
            if (ContactExists(contact.Id))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }
        return Created(contact);
    }
    ...
}

我想更好的方法是将验证属性移动到模型中(以及将来会添加更复杂的业务逻辑验证)并在从ViewModel映射后手动检查模型有效性我在这里找到了相同的想法http://blogs.msdn.com/b/simonince/archive/2010/12/07/view-model-versus-domain-entity-validation-with-mvc.aspx.(手动验证调用适合我)

在这种情况下,我应该做些什么来支持API和UI中的验证?

可能应用程序架构不够好,我很高兴得到任何建议,但我现在还没有完全授权改变任何东西.

解决方法

正如您已经知道的那样(或计算出来),验证可以,将来也应该在许多层面上进行.

您需要做的第一件事是区分应该是UI验证的内容和应该是业务规则验证的内容.

假设我有一个寄存器< form> …< / form>.在该表单中,我有一个简单的电子邮件文本框.

假设我的规则如下:

>电子邮件文本框是必填项
>电子邮件不应该是重复的

我可以快速区分强制文本框应该是UI验证.

至于“无重复电子邮件”规则,这需要访问数据库以查看给定的电子邮件地址是否尚不存在.对我来说,这是一个业务规则验证.

基本上,我的RegisterViewModel将在email属性上设置[required]数据注释属性.这将负责UI验证.

提交后,我将使用Model.IsValid()验证我的ViewModel以进行服务器端验证.
一旦ViewModel没问题,我就会将ViewModel传递给API(或者有些人喜欢在将ViewModel发送到API之前将其转换为POCO).

在API内部,我将调用数据库并检查给定的电子邮件地址是否已存在.

如果确实存在,则该方法将返回false(假设您的方法返回true或false).

Controller将检查返回的值是否为false,并可能向UI添加一些错误.

如果它不存在,那就太好了!将ViewModel(如果之前尚未转换)转换为POCO(或称为Model对象),以便将其保存到数据库中.

在我的例子中(以及我的大多数POCO中)我很少有数据注释我通常将它们留给ViewModel以及我需要的任何更复杂的验证,我在API层中手动完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读