SORU
8 ŞUBAT 2011, Salı


MVC3: jQuery doğrulama ile checkbox gerekli?

Benim "Şart" checkbox zorunlu bir WordPress kullanmak doğrulamak için kullanıyor, MVC3 projesi. Kabul istiyorum Ben şu anda sunucu/istemci KURU/doğrulama SPOT "MS veri açıklama öznitelikleri" "". MS MVC3 göze batmayan jQuery doğrulama

İşte tek başına bir test (düz HTML MVC3 ile oluşturulmuş). Neden işe, lütfen değil mi? Çalıştırıldığında, doğrulama "alanı doldurulur, ancak onay kutusunu durumunu umursamıyor." Kişi Adı sağlar

<!DOCTYPE html>

<html>
<head>
    <title>RequiredCheckbox</title>

    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
    <script type="text/javascript" src="//ajax.microsoft.com/ajax/jQuery.Validate/1.7/jQuery.Validate.js"></script>
    <script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.js"></script>
    <script type="text/javascript" language="javascript">
        $(function () {
            // http://itmeze.com/2010/12/checkbox-has-to-be-checked-with-unobtrusive-jquery-validation-and-asp-net-mvc-3/
            $.validator.unobtrusive.adapters.add("mandatory", function (options) {
                    options.rules["required"] = true;
                    if (options.message) {
                        options.messages["required"] = options.message;
                    }
                }
            });
            $.validator.unobtrusive.parse(document);
        });
    </script>

</head>

<body>
    <div>
        <form>
            <input data-val="true" data-val-mandatory="The field Terms Are Accepted is invalid." id="isTermsAccepted" name="isTermsAccepted" type="checkbox" value="true" />
            <input name="isTermsAccepted" type="hidden" value="false" />
            <span class="field-validation-valid" data-valmsg-for="isTermsAccepted" data-valmsg-replace="true"></span>

            <input data-val="true" data-val-required="The Contact Name field is required." id="contactName" name="contactName" type="text" value="" />
            <span class="field-validation-valid" data-valmsg-for="contactName" data-valmsg-replace="true"></span>
            <button type="submit">Submit</button>
        </form>
    </div>
</body>
</html>





Bu yazının geri kalanını sadece araştırma notlarımı.

Açıklama özniteliği [gerekli] yardımcı olmuyor veri ayarı:
http://forums.89.biz/forums/MVC 3 Unobtrusive validation does not work with checkboxes (jquery validation) and the fix for it.

Sorun değil. Ne "" checkbox için anlamı belli ki MS jquery takım daha iyi tanıdıklarını düşünmeleri nerede girişmek istemiyorum, kutsal bir savaş. gerekli Yerel olarak basit bir mesele olmalıdır uyardı:
$("form").validate({ rules: { cbAgreeToTerms: "required" } });

...değil mi? hayır, çünkü:
http://blog.waynebrantley.com/2011/01/mvc3-breaks-any-manual-use-of-jquery.html
http://pinoytech.org/question/4824071/microsofts-jquery-validate-unobtrusive-makes-other-validators-skip-validation

NE? Oldukça pis tarafı! (Tabii IMHO.)

Şimdi, bu çözümü denedim:
http://itmeze.com/2010/12/checkbox-has-to-be-checked-with-unobtrusive-jquery-validation-and-asp-net-mvc-3/
ve benim için işe yaramadı. Bu yazarın sarkan yorum ve biraz kargo-kültü kullanım ters ONAY testinden önceki/makale beni merak ediyorsanız işte asıl işleri için onu/ona, ne başka voodoo karıştı?

Not JS son parçacık temizleyici eşdeğer olduğunu düşünüyorum
$.validator.unobtrusive.adapters.addBool("brequired", "required"); Bu son yazılan tarafından önerildi:
http://forums.asp.net/p/1648319/4281140.aspx#4281140
Ama bu yazar henüz debug olmadığını yorumlarına dikkat edin. Benim için işe yaramadı, ve satır aralarını okuma, onun için işe yaramadı sanırım?

Bu unobtrusive.js bu aramayı denedim çok docready üzerinde ayrıştırma çağırır, ama bana yardım etmedi.
$.validator.unobtrusive.parse(document); Ayrıca birkaç benzer bir makale buldum ve hiçbiri herhangi bir tür başlatılması hakkında konuşmak. Belki yerel olarak özgün/ortak unobtrusive.js düzenleme hepsi? Eğer elimden bir şey düşünmemeyi tercih ederim, ne adaptörleri için değil mi?

Yığın taşması makaleler, her şey aynı gibi daha karmaşık örnekler buldum:
ASP .Net MVC 3 unobtrusive custom client validation.
Perform client side validation for custom attribute
http://xhalent.wordpress.com/2011/01/27/custom-unobstrusive-jquery-validation-in-asp-net-mvc-3/
Ama zaten denedim daha farklı bir şey göremiyorum.

Bu insanları gerçekten de işe yarıyor mu? Neden bu iş için beni alabilir mi?

CEVAP
22 Mart 2011, Salı


Kabul cevabı uygulamadan kaynaklanan ... burada düzgün çalışan kaynak kodunu özetlenmiştir. Bunu yararlı bulacağını umuyorum.

RequiredCheckbox.SEO

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<RegistrationViewModel>" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title>RequiredCheckbox</title>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
    <script src="//ajax.microsoft.com/ajax/jQuery.Validate/1.7/jQuery.Validate.js" type="text/javascript"></script>
    <script src="//ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.js" type="text/javascript"></script>
    <script type="text/javascript" language="javascript">
        $.validator.unobtrusive.adapters.addBool("mandatory", "required");
    </script>
</head>
<body>
    <div>
        <% 
        // These directives can occur in web.config instead
        Html.EnableUnobtrusiveJavaScript();
        Html.EnableClientValidation();
        using (Html.BeginForm())
        { %>
            <%: Html.CheckBoxFor(model => model.IsTermsAccepted)%>
            <%: Html.ValidationMessageFor(model => model.IsTermsAccepted)%>

            <%: Html.TextBoxFor(model => model.ContactName)%>
            <%: Html.ValidationMessageFor(model => model.ContactName)%>
            <button type="submit">Submit</button>
        <% } %>
    </div>
</body>
</html>

RegistrationViewModel.cs

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

public class RegistrationViewModel {
    [Mandatory (ErrorMessage="You must agree to the Terms to register.")]
    [DisplayName("Terms Accepted")]
    public bool isTermsAccepted { get; set; }

    [Required]
    [DisplayName("Contact Name")]
    public string contactName { get; set; }
}

MandatoryAttribute.cs

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

public class MandatoryAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        return (!(value is bool) || (bool)value);
    }
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        ModelClientValidationRule rule = new ModelClientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
        rule.ValidationType = "mandatory";
        yield return rule;
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BenjiManTV

    BenjiManTV

    20 Mart 2011
  • tatermoog

    tatermoog

    2 AĞUSTOS 2006
  • The Verge

    The Verge

    8 AĞUSTOS 2006