Tôi đang tìm kiếm một giải pháp trong đó tôi có thể sử dụng cùng một mô hình để chèn và cập nhật trong web api. Trong tình huống của tôi là điều này luôn luôn là một nội dung cơ thể. Các [Requiered]
thuộc tính phải được bỏ qua nếu nó là một phương thức cập nhật. Trong giải pháp của tôi, bạn đặt một thuộc tính [IgnoreRequiredValidations]
trên phương thức. Điều này như sau:
public class WebServiceController : ApiController
{
[HttpPost]
public IHttpActionResult Insert(SameModel model)
{
...
}
[HttpPut]
[IgnoreRequiredValidations]
public IHttpActionResult Update(SameModel model)
{
...
}
...
Những gì khác cần phải được thực hiện? Một BodyModelValidator riêng phải được tạo và thêm vào lúc khởi động. Đây là trong HTTPConfiguration và trông như thế này:config.Services.Replace(typeof(IBodyModelValidator), new IgnoreRequiredOrDefaultBodyModelValidator());
using Owin;
using your_namespace.Web.Http.Validation;
[assembly: OwinStartup(typeof(your_namespace.Startup))]
namespace your_namespace
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
Configuration(app, new HttpConfiguration());
}
public void Configuration(IAppBuilder app, HttpConfiguration config)
{
config.Services.Replace(typeof(IBodyModelValidator), new IgnoreRequiredOrDefaultBodyModelValidator());
}
...
BodyModelValidator của riêng tôi có nguồn gốc từ DefaultBodyModelValidator. Và tôi nhận ra rằng tôi đã phải ghi đè lên phương thức 'ShallowValidate'. Trong phần ghi đè này, tôi lọc các trình xác nhận mô hình certierd. Và bây giờ, lớp IgnoreRequiredOrDefaultBodyModelValidator và lớp attributte IgnoreRequiredValidations:
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web.Http.Controllers;
using System.Web.Http.Metadata;
using System.Web.Http.Validation;
namespace your_namespace.Web.Http.Validation
{
public class IgnoreRequiredOrDefaultBodyModelValidator : DefaultBodyModelValidator
{
private static ConcurrentDictionary<HttpActionBinding, bool> _ignoreRequiredValidationByActionBindingCache;
static IgnoreRequiredOrDefaultBodyModelValidator()
{
_ignoreRequiredValidationByActionBindingCache = new ConcurrentDictionary<HttpActionBinding, bool>();
}
protected override bool ShallowValidate(ModelMetadata metadata, BodyModelValidatorContext validationContext, object container, IEnumerable<ModelValidator> validators)
{
var actionContext = validationContext.ActionContext;
if (RequiredValidationsIsIgnored(actionContext.ActionDescriptor.ActionBinding))
validators = validators.Where(v => !v.IsRequired);
return base.ShallowValidate(metadata, validationContext, container, validators);
}
#region RequiredValidationsIsIgnored
private bool RequiredValidationsIsIgnored(HttpActionBinding actionBinding)
{
bool ignore;
if (!_ignoreRequiredValidationByActionBindingCache.TryGetValue(actionBinding, out ignore))
_ignoreRequiredValidationByActionBindingCache.TryAdd(actionBinding, ignore = RequiredValidationsIsIgnored(actionBinding.ActionDescriptor as ReflectedHttpActionDescriptor));
return ignore;
}
private bool RequiredValidationsIsIgnored(ReflectedHttpActionDescriptor actionDescriptor)
{
if (actionDescriptor == null)
return false;
return actionDescriptor.MethodInfo.GetCustomAttribute<IgnoreRequiredValidationsAttribute>(false) != null;
}
#endregion
}
[AttributeUsage(AttributeTargets.Method, Inherited = true)]
public class IgnoreRequiredValidationsAttribute : Attribute
{
}
}
Nguồn:
+1 tốt Q. Sẽ tốt khi đề cập đến xác nhận của khách hàng ở đây. Một tùy chọn là loại bỏ
– Nguyễn Tố Quyên 07:45:32 20/03/2011RequiredAttr
hoàn toàn và kiểm tra phía máy chủ khi bạn cần. Nhưng điều này sẽ gây khó khăn cho khách hàngĐiểm cho bất kỳ ai cũng bao gồm việc vô hiệu hóa một số trường nhất định khỏi xác thực ứng dụng khách (không xóa các tham chiếu đến xác thực jquery)
– Trần Nhật Anh 07:46:58 20/03/2011Có thể tôi đang thiếu quan điểm của bạn, nhưng nếu người dùng đã chỉ định trước các giá trị, thì các giá trị đó đã có sẵn và do đó sẽ vượt qua Xác thực bắt buộc. Có phải ý của bạn là thứ khác?
– Dương Ðắc Di 08:11:46 20/03/2011Vì các giá trị này đã được băm, chẳng hạn như mật khẩu và câu trả lời bảo mật, vì vậy nếu chúng nhập một giá trị mới trên biểu mẫu chỉnh sửa, tôi muốn băm lại giá trị mới trước khi chèn, nhưng tôi cũng muốn tùy chọn cho nó bị bỏ trống loại điều
– Hoàng Cẩm Nhung 02:52:01 21/03/2011@gideon: xem câu trả lời của Adrian Smith: stackoverflow.com/a/9781066/114029
– Hoàng Tuyết Trầm 15:56:58 15/04/2012