MVC मॉडल के लिए सही होना आवश्यक है


85

क्या डेटा एनोटेशन के माध्यम से एक तरीका है कि बूलियन प्रॉपर्टी को सच करने की आवश्यकता है?

public class MyAwesomeObj{
    public bool ThisMustBeTrue{get;set;}
}

क्या वास्तव में इस का उपयोग मामला है? क्या आप केवल संपत्ति को केवल पढ़ने के लिए नहीं दे सकते थे और हर समय सही थे?
Jan Thomä

1
यह कहना बहुत ज्यादा है ... अरे दोस्त आप मुझे सहमत मानने की जांच करना भूल गए ... जो मॉडल को अमान्य बना देना चाहिए।
मार्टी ट्रेनाउथ

मुझे लगता है कि यह कुछ ऐसा है जिसे आप क्लाइंट-साइड हैंडल करना चाहते हैं।
साइकोकार्ड

15
@PychoCoder: इसे दोनों तरफ से हैंडल किया जाना चाहिए ... न कि केवल क्लाइंट की तरफ। मैं सिर्फ यह देखना चाह रहा था कि क्या एक साधारण डेटा एनोटेशन जोड़कर इसे संभाला जा सकता है।
मार्टी ट्रेनाउथ

जवाबों:


49

आप अपना स्वयं का सत्यापनकर्ता बना सकते हैं:

public class IsTrueAttribute : ValidationAttribute
{
    #region Overrides of ValidationAttribute

    /// <summary>
    /// Determines whether the specified value of the object is valid. 
    /// </summary>
    /// <returns>
    /// true if the specified value is valid; otherwise, false. 
    /// </returns>
    /// <param name="value">The value of the specified validation object on which the <see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"/> is declared.
    ///                 </param>
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");

        return (bool) value;
    }

    #endregion
}

मैं एक ग्राहक पक्ष कार्यान्वयन के साथ इसे बढ़ाने पर विचार करूंगा - अन्य उत्तरों में संदर्भित दूरस्थ सत्यापन का उपयोग करने के बजाय, यहां विचलित
समस्टीफेंस

यह हमारे लिए एक अच्छा (और परीक्षण किया हुआ) त्वरित समाधान है। हम @ dazbradbury के समाधान (एक अच्छा भी) में ग्राहक पक्ष सत्यापन के बिना कर सकते हैं क्योंकि हमें केवल एक सर्वेक्षण के पिछले पृष्ठ पर एक अकेला चेकबॉक्स पर इसकी आवश्यकता है।
सेठ

return (bool) value == true;यह एक बेमानी तुलना है
T-moty

130

मैं सर्वर और क्लाइंट पक्ष दोनों के लिए एक सत्यापनकर्ता बनाऊंगा। MVC और विनीत रूप सत्यापन का उपयोग करना, यह केवल निम्नलिखित करके प्राप्त किया जा सकता है:

सबसे पहले, सर्वर साइड सत्यापन जैसे करने के लिए अपनी परियोजना में एक वर्ग बनाएं:

public class EnforceTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");
        return (bool)value == true;
    }

    public override string FormatErrorMessage(string name)
    {
        return "The " + name + " field must be checked in order to continue.";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = String.IsNullOrEmpty(ErrorMessage) ? FormatErrorMessage(metadata.DisplayName) : ErrorMessage,
            ValidationType = "enforcetrue"
        };
    }
}

इसके बाद, अपने मॉडल में उपयुक्त संपत्ति का विवरण दें:

[EnforceTrue(ErrorMessage=@"Error Message")]
public bool ThisMustBeTrue{ get; set; }

और अंत में, अपने दृश्य में निम्नलिखित स्क्रिप्ट जोड़कर ग्राहक पक्ष सत्यापन सक्षम करें:

<script type="text/javascript">
    jQuery.validator.addMethod("enforcetrue", function (value, element, param) {
        return element.checked;
    });
    jQuery.validator.unobtrusive.adapters.addBool("enforcetrue");
</script>

नोट: हमने पहले से ही एक विधि बनाई है GetClientValidationRulesजो हमारे एनोटेशन को हमारे मॉडल से दृश्य में धकेलती है।

यदि अंतर्राष्ट्रीयकरण के लिए त्रुटि संदेश की आपूर्ति करने के लिए संसाधन फ़ाइलों का उपयोग करते हैं, तो FormatErrorMessageकॉल को हटा दें (या बस आधार को कॉल करें) और इस GetClientValidationRulesतरह से विधि को ट्वीक करें:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    string errorMessage = String.Empty;
    if(String.IsNullOrWhiteSpace(ErrorMessage))
    {
        // Check if they supplied an error message resource
        if(ErrorMessageResourceType != null && !String.IsNullOrWhiteSpace(ErrorMessageResourceName))
        {
            var resMan = new ResourceManager(ErrorMessageResourceType.FullName, ErrorMessageResourceType.Assembly);
            errorMessage = resMan.GetString(ErrorMessageResourceName);
        }
    }
    else
    {
        errorMessage = ErrorMessage;
    }

    yield return new ModelClientValidationRule
    {
        ErrorMessage = errorMessage,
        ValidationType = "enforcetrue"
    };
}

3
इसके लिए धन्यवाद - यह बहुत अच्छा काम करता है! यह ओवरराइड FormatErrorMessage पद्धति को हटाने के साथ बेहतर काम करता है - जिस तरह से संसाधन फ़ाइलों से त्रुटि संदेशों का स्थानीयकरण काम करता है। मेरा उपयोग: [EnforceTrue (ErrorMessageResourceType = typeof (ValidationMessages), ErrorMessageResourceName = "शर्तेंAndConditionsRequired")]
मैट फ्रेड

2
मुझे काम करने के लिए क्लाइंट की ओर से मान्यता नहीं मिल सकती है और मैं जो गलत कर रहा हूं उसे बता नहीं सकता। मुझे वास्तव में जेवसट्रिप कहाँ रखना चाहिए? हेड टैग में? नियंत्रक के बगल में?
बनामदेव

मैं सहमत हूं, इसका उत्तर होना चाहिए
सिमुआ

1
कस्टम सत्यापन विशेषताओं की शक्ति दिखाने वाला महान समाधान! हालाँकि मैं स्क्रिप्ट को एक विश्व स्तर पर संदर्भित जेएस फ़ाइल में रखने की सलाह देता हूं, न कि दृश्य (एस), पुन: उपयोग के लिए। इसके अलावा, संदेश के सभी तरीकों को संभालने के लिए सबसे अच्छा जोड़ा जा सकता है: डिफ़ॉल्ट यदि कोई प्रदान नहीं किया गया है, या संदेश स्ट्रिंग, या संसाधन फ़ाइल से।
जीपवर्न

1
महान समाधान, पोस्टिंग के लिए धन्यवाद। उन लोगों के लिए जो काम करने के लिए क्लाइंट साइड वैलिडेशन प्राप्त नहीं कर सकते हैं: आपको नियंत्रण से पहले jQuery सत्यापन को विस्तारित करना होगा जो इसे मान्य किया जाएगा लोड किया गया है, इसलिए स्क्रिप्ट को सिर में रखें, और विंडो में नहीं। लोड / डॉलर (दस्तावेज़) ) .रेड () इवेंट।
Evert

92

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन ऐसा करने के लिए एक सरल सर्वर साइड तरीका साझा करना चाहता था। आप एक सार्वजनिक संपत्ति को सही बनाते हैं और अपने बूल की तुलना उस संपत्ति से करते हैं। यदि आपका बूल चेक नहीं किया गया है (डिफ़ॉल्ट रूप से गलत है) तो फॉर्म मान्य नहीं होगा।

public bool isTrue
{ get { return true; } }

[Required]
[Display(Name = "I agree to the terms and conditions")]
[Compare("isTrue", ErrorMessage = "Please agree to Terms and Conditions")]
public bool AgreeTerms { get; set; }

रेजर कोड

@Html.CheckBoxFor(m => Model.AgreeTerms, new { id = "AgreeTerms", @checked = "checked" })
<label asp-for="AgreeTerms" class="control-label"></label>
<a target="_blank" href="/Terms">Read</a>
<br />
@Html.ValidationMessageFor(model => model.AgreeTerms, "", new { @class = "text-danger" })
@Html.HiddenFor(x => Model.isTrue)

12
सादगी के लिए +1। FYI करें: मुझे काम करने के लिए 'TheTrue' संपत्ति को सार्वजनिक करना पड़ा।
टॉड बर्डसाल

तुलना मेरे लिए MVC4 में नहीं है
माइकल रुडनर इवान्चिक

सुपर सॉल्यूशन महान समाधान
श्रीजिथ एसएस

9
और यदि आप ".True" संपत्ति के लिए एक छिपा हुआ जोड़ते हैं, तो आपको क्लाइंट साइड सत्यापन मिलता है
बिलोरिड

2
इस शानदार दिखने वाले समाधान की घोषणा करना मेरे काम नहीं आया। Mvc 5.2.3 पर परीक्षण किया गया।
हार्वेस्ट जूल

22

मैंने कई समाधान आजमाए लेकिन उनमें से किसी ने भी क्लाइंट और सर्वर साइड सत्यापन दोनों प्राप्त करने के लिए मेरे लिए पूरी तरह से काम नहीं किया। तो मैंने अपने MVC 5 आवेदन में क्या किया, इसे काम करने के लिए:

आपके ViewModel में (सर्वर साइड सत्यापन के लिए):

public bool IsTrue => true;

[Required]
[Display(Name = "I agree to the terms and conditions")]
[Compare(nameof(IsTrue), ErrorMessage = "Please agree to Terms and Conditions")]
public bool HasAcceptedTermsAndConditions { get; set; }

आपके रेज़र पृष्ठ में (क्लाइंट पक्ष सत्यापन के लिए):

<div class="form-group">
   @Html.CheckBoxFor(m => m.HasAcceptedTermsAndConditions)
   @Html.LabelFor(m => m.HasAcceptedTermsAndConditions)
   @Html.ValidationMessageFor(m => m.HasAcceptedTermsAndConditions)

   @Html.Hidden(nameof(Model.IsTrue), "true")
</div>

1
आकर्षक समाधान!
टोबियास

3
छिपे हुए क्षेत्र ("सच") के लिए मूल्य का ख्याल रखें!
टोबियास

10

मैं निम्नलिखित फिडल के लिए लोगों को निर्देशित करना चाहूंगा: https://dotnetfiddle.net/JbPh0X

उपयोगकर्ता ने [Range(typeof(bool), "true", "true", ErrorMessage = "You gotta tick the box!")]अपनी बूलियन संपत्ति में जोड़ा जो काम करने के लिए सर्वर साइड सत्यापन का कारण बनता है।

क्लाइंट पक्ष सत्यापन कार्य करने के लिए भी, उन्होंने निम्नलिखित स्क्रिप्ट जोड़ी:

// extend jquery range validator to work for required checkboxes
var defaultRangeValidator = $.validator.methods.range;
$.validator.methods.range = function(value, element, param) {
    if(element.type === 'checkbox') {
        // if it's a checkbox return true if it is checked
        return element.checked;
    } else {
        // otherwise run the default validation function
        return defaultRangeValidator.call(this, value, element, param);
    }
}

9

बस यह देखने के लिए जांचें कि क्या उसका स्ट्रिंग प्रतिनिधित्व इसके बराबर है True:

[RegularExpression("True")]
public bool TermsAndConditions { get; set; }

@JeradRose यह केवल सर्वर पर ठीक मान्य है। क्या आप क्लाइंट-साइड सत्यापन की बात कर रहे हैं?
ta.speot.is

3
पुष्टि की गई है, यह सर्वर साइड काम करता है लेकिन क्लाइंट साइड नहीं
मैट फियर

मैंने सोचा कि सर्वर साइड सत्यापन एक प्रकार का बेमेल अपवाद हो सकता है जो किसी स्ट्रिंग से बूल की तुलना करने की कोशिश कर रहा हो।
जेरद रोज

RegularExpressionAttributeआंतरिक रूप Convert.ToStringसे संपत्ति के मूल्य का स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए उपयोग करता है (जो इसे के रूप में वितरित किया जाता है object)।
ta.speot.is

मुझे लगता है कि यह उत्तर मेरे लिए @ फ़ील्ड-केज +1 से अधिक सरल है
आरोन हुडोन

5

आप या तो अपनी विशेषता बना सकते हैं या CustomValidationAttribute का उपयोग कर सकते हैं

यह है कि आप CustomValidationAttribute का उपयोग कैसे करेंगे:

[CustomValidation(typeof(BoolValidation), "ValidateBool")]

जहां BoolValidation को परिभाषित किया गया है:

public class BoolValidation
{
  public static ValidationResult ValidateBool(bool boolToBeTrue)
  {
    if (boolToBeTrue)
    {
      return ValidationResult.Success;
    }
    else
    {
      return new ValidationResult(
          "Bool must be true.");
    }
  }

5

[Required]विशेषता किसी भी मूल्य की आवश्यकता के लिए है - यह सच या गलत हो सकता है। आपको इसके लिए एक और सत्यापन का उपयोग करना होगा।


3

Ta.speot.is द्वारा पोस्ट पर और जेरड रोज की टिप्पणी के बाद:

दिए गए पद विनीत सत्यापन के साथ क्लाइंट-साइड काम नहीं करेंगे। यह दोनों शिविरों (क्लाइंट और सर्वर) में काम करना चाहिए:

[RegularExpression("(True|true)")]
public bool TermsAndConditions { get; set; }

नहीं पता कि यह एक नया संस्करण है या नहीं, लेकिन यह मेरे लिए jquery.validate 1.19.2 और jquery.validate.unobtrusive 3.2.11 के साथ काम नहीं कर रहा है। समस्या यह है कि regexविधि विनीत परिभाषित करता है पहले जाँचता है कि क्या रेक्सक्स को सत्यापित करने से पहले चेकबॉक्स वैकल्पिक है, जो समझ में आता है, सिवाय इसके कि jquery.validate वैकल्पिक होने के लिए किसी भी अनचेक किए गए चेकबॉक्स पर विचार करता है। tl; dr यह केवल चेक किए गए चेकबॉक्स पर रेगेक्स चलाता है। हम regex validatorविधि के लिए एक शिम जोड़ सकते हैं या केवल एक कस्टम सत्यापनकर्ता बना सकते हैं ।
xr280xr

3

.NET कोर MVC - डेटा एनोटेशन के साथ आवश्यक चेकबॉक्स

public class MyModel
{
    [Display(Name = "Confirmation")]
    [Range(typeof(bool), "true", "true", ErrorMessage = "Please check the Confirmation checkbox.")]
    public bool IsConfirmed { get; set; }   
}

<div class="custom-control custom-checkbox col-10">
    <input type="checkbox" asp-for="IsConfirmed" class="custom-control-input" />
    <label class="custom-control-label" for="IsConfirmed">
        "By clicking 'submit', I confirm."
    </label>
    <span asp-validation-for="IsConfirmed" class="text-danger"></span>
</div>

<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>

<script type="text/javascript">
    $(document).ready(function () {
        // extend range validator method to treat checkboxes differently
        var defaultRangeValidator = $.validator.methods.range;
        $.validator.methods.range = function (value, element, param) {
            if (element.type === 'checkbox') {
                // if it's a checkbox return true if it is checked
                return element.checked;
            } else {
                // otherwise run the default validation function
                return defaultRangeValidator.call(this, value, element, param);
            }
        }
    });
</script>

श्रेय दें: jasonwatmore.com/post/2013/10/16/…
xr280xr

2

मैं DataAnnotations के माध्यम से एक तरह से नहीं जानता, लेकिन यह आपके नियंत्रक में आसानी से किया जाता है।

public ActionResult Add(Domain.Something model)
{

    if (!model.MyCheckBox)
        ModelState.AddModelError("MyCheckBox", "You forgot to click accept");

    if (ModelState.IsValid) {
        //'# do your stuff
    }

}

केवल दूसरा विकल्प सर्वर साइड के लिए कस्टम सत्यापनकर्ता और क्लाइंट साइड के लिए दूरस्थ सत्यापनकर्ता बनाना होगा (दूरस्थ सत्यापन केवल एमवीसी 3 + में उपलब्ध है)


किंडा पहले से ही नया है कि पहले से ही बुलियन ध्वज की जांच कैसे करें .... जानना चाहते थे कि क्या इसके लिए डेटानोटेशन था।
मार्टी ट्रेनाउथ

2

क्या आपके पास web.config में उचित आइटम सेट हैं ?

यह सत्यापन कार्य नहीं करने का कारण बन सकता है।

आप एक कस्टम सत्यापन विशेषता बनाने का भी प्रयास कर सकते हैं (क्योंकि [Required]केवल यह मौजूद है या नहीं, इसकी परवाह है और आप मूल्य की परवाह करते हैं):

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
sealed public class RequiredTrueAttribute : ValidationAttribute
{
    // Internal field to hold the mask value.
    readonly bool accepted;

    public bool Accepted
    {
        get { return accepted; }
    }

    public RequiredTrueAttribute(bool accepted)
    {
        this.accepted = accepted;
    }

    public override bool IsValid(object value)
    {
        bool isAccepted = (bool)value;
        return (isAccepted == true);
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture,
          ErrorMessageString, name, this.Accepted);
    }
}

फिर, उपयोग:

[RequiredTrue(ErrorMessage="{0} requires acceptance to continue.")]
public bool Agreement {get; set;}

से यहाँ


2

इसी से मेरा काम बना है। और कुछ नहीं किया। Mvc 5:

नमूना

public string True
{
  get
  {
    return "true";
  }
}

[Required]
[Compare("True", ErrorMessage = "Please agree to the Acknowlegement")]
public bool Acknowlegement { get; set; }

राय

  @Html.HiddenFor(m => m.True)
  @Html.EditorFor(model => model.Acknowlegement, new { htmlAttributes = Model.Attributes })
  @Html.ValidationMessageFor(model => model.Acknowlegement, "", new { @class = "text-danger" })

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें


2

के लिए ASP.NET कोर MVC यहाँ, क्लाइंट और सर्वर सत्यापन है dazbradbury के समाधान के आधार पर

public class EnforceTrueAttribute : ValidationAttribute, IClientModelValidator
{
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");
        return (bool)value;
    }

    public void AddValidation(ClientModelValidationContext context)
    {
        MergeAttribute(context.Attributes, "data-val", "true");
        var errorMessage = ErrorMessage ?? 
            $"The value for field {context.ModelMetadata.GetDisplayName()} must be true.";
        MergeAttribute(context.Attributes, "data-val-enforcetrue", errorMessage);
    }

    private void MergeAttribute(IDictionary<string, string> attributes,
        string key,
        string value)
    {
        if (attributes.ContainsKey(key))
        {
            return;
        }
        attributes.Add(key, value);
    }
}

और फिर ग्राहक पर:

$.validator.addMethod("enforcetrue", function (value, element, param) {
    return element.checked;
});

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

फिर उपयोग है:

[EnforceTrue(ErrorMessage = "Please tick the checkbox")]
public bool IsAccepted { get; set; }

1

मैंने खेतों का उपयोग करने की कोशिश की। उत्तर का जवाब और यह मेरे लिए बहुत काम नहीं आया, लेकिन कुछ सरल था, और मुझे यकीन नहीं है कि क्यों (विभिन्न रेजर संस्करण, शायद?), लेकिन मुझे बस इतना करना था:

[Required]
[Range(typeof(bool), "true", "true", ErrorMessage = "Agreement required.")]
[Display(Name = "By clicking here, I agree that my firstborn child will etc etc...")]
public bool Agreement1Checked { get; set; }

और .cshtml फ़ाइल में:

@Html.CheckBoxFor(m => m.Agreement1Checked)
@Html.LabelFor(m => m.Agreement1Checked)
@Html.ValidationMessageFor(m => m.Agreement1Checked)

यह मेरे लिए क्लाइंट-साइड काम नहीं करता है। किसी कारण के लिए पैरामीटर jquery.validate नियम विधि को पारित किया जाता है, [NaN, NaN]जहां यह होना चाहिए[true, true]
xr280xr

@ xr280xr तब भी जब उपयोगकर्ता ने चेकबॉक्स चेक किया हो?
ड्रोनज़

0

मुझे लगता है कि इसे संभालने का सबसे अच्छा तरीका सिर्फ अपने कंट्रोलर में चेक करना है यदि बॉक्स सही है अन्यथा केवल अपने मॉडल में एक त्रुटि जोड़ें और इसे अपने विचार को फिर से परिभाषित करें।

जैसा कि पहले कहा गया था कि सभी [आवश्यक] यह सुनिश्चित करते हैं कि कोई मूल्य हो और आपके मामले में अगर जाँच नहीं की गई है तो भी आप झूठे हैं।


0

यहां फुलप्रूफ वैधीकरण देखें । आप इसे Nuget के माध्यम से डाउनलोड / इंस्टॉल कर सकते हैं।

यह इस तरह की चीज़ों के लिए एक महान पुस्तकालय है।


हालांकि ... डिफ़ॉल्ट सत्यापन विशेषताएँ बहुत अच्छी तरह से काम करती हैं।
पंगम्मा

0
/// <summary> 
///  Summary : -CheckBox for or input type check required validation is not working the root cause and solution as follows
///
///  Problem :
///  The key to this problem lies in interpretation of jQuery validation 'required' rule. I digged a little and find a specific code inside a jquery.validate.unobtrusive.js file:
///  adapters.add("required", function (options) {
///  if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
///    setValidationValues(options, "required", true);
///    }
///   });
///   
///  Fix: (Jquery script fix at page level added in to check box required area)
///  jQuery.validator.unobtrusive.adapters.add("brequired", function (options) {
///   if (options.element.tagName.toUpperCase() == "INPUT" && options.element.type.toUpperCase() == "CHECKBOX") {
///              options.rules["required"] = true;
///   if (options.message) {
///                   options.messages["required"] = options.message;
///                       }
///  Fix : (C# Code for MVC validation)
///  You can see it inherits from common RequiredAttribute. Moreover it implements IClientValidateable. This is to make assure that rule will be propagated to client side (jQuery validation) as well.
///  
///  Annotation example :
///   [BooleanRequired]
///   public bool iAgree { get; set' }
/// </summary>


public class BooleanRequired : RequiredAttribute, IClientValidatable
{

    public BooleanRequired()
    {
    }

    public override bool IsValid(object value)
    {
        return value != null && (bool)value == true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new ModelClientValidationRule[] { new ModelClientValidationRule() { ValidationType = "brequired", ErrorMessage = this.ErrorMessage } };
    }
}

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
रवि धोरिया

यह इस लिंक को इस कारण से जाँचता है कि यह सत्यापन में विफल क्यों है- जांचता है है- itmeze.com/2010/12/06/…
dhandapani haricrishnan

आज यह काम करता है। क्या आप यह सुनिश्चित कर सकते हैं कि यह 5, 10 साल बाद काम करेगा? ये Q & A DB भविष्य के उपयोगकर्ताओं के लिए भी बनाए गए हैं
Eliyahu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.