gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:17:36 25 4
gpt4 key购买 nike

我有一个包含 Model 和 ViewModel 的 ASP.Net MVC 应用程序,该应用程序具有 UI 和 API 接口(interface),可通过不同的 Controller 工作,UI 与 ViewModel 一起使用,API 与 Model 一起使用。 ViewModel 使用数据注释(C# 属性)进行验证,而 Model 没有,因此现在 API 允许将任何不一致的模型保存到数据库。

我现在拥有的:

// 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 转换为 POCO,然后再将其发送给 API)。

    在 API 中,我会调用数据库并检查给定的电子邮件地址是否不存在。

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

    Controller 会检查返回的值是否为假,并可能会在 UI 中添加一些错误。

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

    在我的示例(以及我的大多数 POCO)中,我很少有数据注释,我通常将它们留给 ViewModel,无论我需要什么更复杂的验证,我都会在 API 层中手动进行。

    关于asp.net-mvc - 如何处理 ASP.Net MVC 中的 Model 和 ViewModel 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23700874/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com