আমি এমন কোনও সমাধান খুঁজছিলাম যেখানে আমি ওয়েব এপিআইতে sertোকানো এবং আপডেট করার জন্য একই মডেলটি ব্যবহার করতে পারি। আমার পরিস্থিতিতে এটি সর্বদা শরীরের বিষয়বস্তু। [Requiered]
যদি এটা একটি আপডেট পদ্ধতি বৈশিষ্ট্যাবলী এড়ানো করা আবশ্যক। আমার সমাধানে, আপনি [IgnoreRequiredValidations]
পদ্ধতির উপরে একটি বৈশিষ্ট্য রাখুন । এটি নিম্নরূপ:
public class WebServiceController : ApiController
{
[HttpPost]
public IHttpActionResult Insert(SameModel model)
{
...
}
[HttpPut]
[IgnoreRequiredValidations]
public IHttpActionResult Update(SameModel model)
{
...
}
...
আর কী করা দরকার? একটি নিজস্ব বডিমোডেলভালিডেটর অবশ্যই প্রারম্ভকালে বক্রযুক্ত এবং যুক্ত করা উচিত। এটি এইচটিটিপি কনফিগারেশনে রয়েছে এবং দেখতে এটির মতো দেখাচ্ছে: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());
}
...
আমার নিজস্ব বডিমোডেলভিডিয়েটর ডিফল্টবডি মডেলভালিডেটর থেকে প্রাপ্ত from এবং আমি বুঝতে পারি যে আমাকে 'শ্যালোভালিডেট' মেথোডকে ওভাররাইড করতে হয়েছিল। এই ওভাররাইডে আমি প্রয়োজনীয় মডেল ভ্যালিডিটারগুলিকে ফিল্টার করি। এবং এখন 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
সম্পূর্ণ অপসারণ এবং আপনার যখন প্রয়োজন হবে তখন একটি সার্ভার সাইড চেক করুন । তবে এটি ক্লায়েন্টের পক্ষে জটিল হবে