मैं एक ऐसे समाधान की तलाश में था जहाँ मैं एक ही मॉडल को वेब एप में डालने और अपडेट के लिए उपयोग कर सकूं। मेरी स्थिति में यह हमेशा एक शरीर सामग्री है। [Requiered]
अगर यह एक अद्यतन विधि है विशेषताओं को छोड़ दिया जाना चाहिए। मेरे समाधान में, आप [IgnoreRequiredValidations]
विधि के ऊपर एक विशेषता रखते हैं । यह इस प्रकार है:
public class WebServiceController : ApiController
{
[HttpPost]
public IHttpActionResult Insert(SameModel model)
{
...
}
[HttpPut]
[IgnoreRequiredValidations]
public IHttpActionResult Update(SameModel model)
{
...
}
...
और क्या करने की जरूरत है? एक खुद का BodyModelValidator शुरू किया जाना चाहिए और स्टार्टअप में जोड़ा जाना चाहिए। यह HttpConfiguration में है और इस तरह दिखता है: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 DefaultBodyModelValidator से लिया गया है। और मुझे पता है कि मुझे 'ShallowValidate' मेथोड को ओवरराइड करना था। इस ओवरराइड में मैं अपेक्षित मॉडल सत्यापनकर्ताओं को फ़िल्टर करता हूं। और अब IgnoreRequiredOrDefaultBodyModelValidator वर्ग और 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
{
}
}
सूत्रों का कहना है:
RequiredAttr
पूरी तरह से हटा दें और जब आपको आवश्यकता हो तो सर्वर साइड जांच करें। लेकिन यह क्लाइंट पर मुश्किल होगा