您的位置:首页 > 其它

如何使用 Web API 来对 MVC 应用程序进行身份验证

2016-04-09 19:18 671 查看
如何使用web api 保证数据的有效性?实际项目中不是什么数据提交过来都是符合要求的,况且在天朝还有N多河蟹的关键字等等。所以以下内容就是增加web api 数据验证.

第一步修改 实体模型



public class UserInfo

{

public int Id {get; set; }

[Required]

[StringLength(20,ErrorMessage="名字太长了或者太短了",MinimumLength=4)]

public string Name {get; set; }

[RegularExpression(@"([2-5]\d)",ErrorMessage="年龄在20-50之间")]

public int Age {get; set; }

}



注意:需要添加 System.ComponentModel.DataAnnotations; 引用

第二步增加Filter



public class ValidationAttribute : ActionFilterAttribute

{

public override void OnActionExecuting(HttpActionContext actionContext)

{

if (!actionContext.ModelState.IsValid)

{

actionContext.Response = actionContext.Request.CreateErrorResponse(

HttpStatusCode.BadRequest,

actionContext.ModelState);

}

}

}



注意:需要引入命名空间



using System.Web;

using System.Web.Http.Filters;

using System.Web.Http.ModelBinding;

using System.Web.Http.Controllers;

using System.Net.Http;

using System.Net;

using Newtonsoft.Json.Linq;



第三步 注册Filter

打开 webApiConfig

添加代码

config.Filters.Add(new Filters.ValidationAttribute());

第四步 编写页面

引入js/CSS

<link href="Content/Site.css" rel="stylesheet" type="text/css" />

<script src="Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>

<script src="Scripts/knockout-2.1.0.js" type="text/javascript"></script>

<script src="Scripts/jquery.validate.min.js" type="text/javascript"></script>

<script src="Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>

拷贝HTMLPage2的内容稍作修改



<label for="text">

名称</label>

<input id="name" name="name" data-val="true" data-val-required="是不是忘记输入名称了?" type="text"

value="" />

<span class="field-validation-valid" data-valmsg-for="name" data-valmsg-replace="true">

</span>

<label for="text">

年龄</label>

<input id="age" name="age" type="text" data-val="true" data-val-required="年龄也是必须输入的哦!"

value="" />

<span class="field-validation-valid" data-valmsg-for="age" data-valmsg-replace="true">

</span>

<br />

<button type="submit">

Submit</button>



增加js,这段js是将服务返回的错误消息进行显示



$.validator.addMethod("failure", function () {return false; });

$.validator.unobtrusive.adapters.addBool("failure");

$.validator.unobtrusive.revalidate = function (form, validationResult) {

$.removeData(form[0], 'validator');

var serverValidationErrors = [];

for (var property in validationResult) {

var elementId = property.toLowerCase();

elementId = elementId.substr(elementId.indexOf('.') + 1);

var item = form.find('#' + elementId);

serverValidationErrors.push(item);

item.attr('data-val-failure', validationResult[property][0]);

jQuery.validator.unobtrusive.parseElement(item[0]);

}

form.valid();

$.removeData(form[0], 'validator');

$.each(serverValidationErrors, function () {

this.removeAttr('data-val-failure');

jQuery.validator.unobtrusive.parseElement(this[0]);

});

}



增加服务器返回错误消息显示操作

400 /* BadRequest */: function (jqxhr) {

var validationResult = $.parseJSON(jqxhr.responseText);

$.validator.unobtrusive.revalidate(form, validationResult.ModelState);

}

浏览测试得到效果

1 没有任何输入



2 输入不合法



本篇完整代码:/Files/risk/web api 5/MvcApplication1.rar

public class RegisterController : ApiController
02
{private ApplicationUserManager UserManager
03
{get
04
{return Request.GetOwinContext().GetUserManager<
ApplicationUserManager
> ();
05
}
06
}public IHttpActionResult Post(RegisterApiModel model)
07
{if (!ModelState.IsValid)
08
{return BadRequest(ModelState);
09
}var user = new ApplicationUser
10
{
11
Email = model.Email,
12
UserName = model.Email,
13
EmailConfirmed = true
14
};
15
var result = UserManager.Create(user, model.Password);
16
return result.Succeeded ? Ok() : GetErrorResult(result);
17
}
18
private IHttpActionResult GetErrorResult(IdentityResult result)
19
{
20
if (result == null)
21
{
22
   
return InternalServerError();
23
}
24
if (result.Errors != null)
25
{
26
   
foreach (var error in result.Errors)
27
{
28
ModelState.AddModelError("", error);
29
}
30
}
31
if (ModelState.IsValid)
32
{ 
33
  
// No ModelState errors are available to send, so just return an empty BadRequest.
34
  
return BadRequest();
35
}
36
return BadRequest(ModelState);
37
}
38
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: