2012-12-19 42 views
7

WebApi'ye geri dönen nesnelerimde istemci tarafı doğrulaması gerçekleştirmeye çalışıyorum. Varlığı webapi aracılığıyla Varlık düzenleme ekranına gönderirim. Nesneyi alanlara bağlamak için nakavt kullanıyorum.WebApi ile İstemci Tarafı Doğrulaması

Tüm sunucu tarafı doğrulamasını ele alan bir işlem filtrem zaten var. Etki alanı modeli veri notlarımı çoğaltmak zorunda kalmadan istemci tarafı doğrulamasını nasıl ekleyebilirim?

cevap

0

HTTP API'mi oluşturduğumda, model nesneleri (DTO'lar, istek modelleri, vb.) .NET istemcileri için dağıtabileceğim ayrı bir gruba koydum.

public abstract class UserUpdateRequestModel { 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    [Required] 
    [EmailAddress] 
    [StringLength(320)] 
    public string Email { get; set; } 
} 

Bu benim API kullanmak budur:

aşağıdaki sınıf düşünün

public UserDto PutUser(Guid key, UserUpdateRequestModel requestModel) { 

    // Do something here 
} 

Sen oluşturmak için örneğin, ASP.NET MVC istemci uygulamasında bu aynı model kullanabilir ASP.NET MVC olarak data- özniteliklerine sahip HTML girişleri, veri ek açıklama doğrulama özniteliklerini temel alarak bunları oluşturma yöntemine sahiptir.

+0

Yani içerecektir meta nesne çeşit (eklersiniz doğrulama öznitelikleri) webapi yanıtına mı? İstemci tarafı kodunu oluşturmaya nasıl başladınız? –

+0

Eğer ASP.NET MVC kullanacaksanız, bunun bir yolu vardır. Örneğin 'TextBoxFor' html helper yöntemi ile. Bir göz atın: http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model – tugberk

+0

Yanıt için teşekkürler. Ben aslında MVC kullanmıyorum. Tüm iletişim ve kalıcılık için WebApi kullanıyorum. HTML Yardımcıları, yalnızca klasik MVC denetleyicileri kullandığınız zaman içindir. –

1

WebApi ile, model doğrulama hatalarından geri gelen hataları istemci tarafı doğrulayıcıya bağlamak için biraz “yapıştırıcı” koduna ihtiyacınız vardır.

modelde
function extractErrors(jqXhr, validator) { 
    var data = JSON.parse(jqXhr.responseText), // parse the response into a JavaScript object 
     errors = {}; 

    $.each(data.ModelState, function (key, value) { 
     var pieces = key.split('.'); 
     key = pieces[pieces.length - 1]; 
     errors[key] = value 
    }); 

    validator.showErrors(errors); // show the errors using the validator object 
} 

, her zamanki gibi açıklama:

[Required] 
[Display(Name = "Group Name")] 
public string Name { get; set; } 

görünümünde, ValidationMessageFor etiketler ekleyin:

@Html.EditorFor(m => m.Name) 
@Html.ValidationMessageFor(m => m.Name) 
+0

Cevap için teşekkürler Phillip. Bu, herhangi bir doğrulama kullanıcıya gösterilmeden önce bir sunucu tarafı gidiş gelişi gerektirir. [Zorunlu] özniteliğini alın, hata değişkeninize sunucuda başarısız oluncaya kadar eklemediğini görmezsiniz. Çözümü yanlış anlamış olmadıkça veya problemimi açıklamakta epeyce başarısız oldum. –

+2

Doğru, değerleri sunucuya gönderir ve bir json dizesini geri alır. Benim durumumda, formlarım çok büyük değildi, bu yüzden müşteri tarafında “beğeniyor” performansı ve istemci tarafı “beğeniyor” davranışı, belirgin bir geri gönderme yok. 10 değerlikli küçük bir formda, sunucu gezisinin maliyeti: yerel olarak sunucuya vurmak üzere bir saniyenin 1/100'ü . Kurumsal LAN'dan bir AWS bulut sunucusuna isabet eden bir saniyenin 1/10'u. Bu, mobil/yavaş bağlantılar için uygun olmayan, kurumsal bir LOB türü uygulama içindi. Benim durumumda, modele açıklama ekleyerek validasyonu kontrol etmeye değdi ve daha temiz ve daha hızlı bir şekilde geliştirildi. –

+0

Ekstra bilgi için teşekkürler, aslında oldukça faydalıdır. Ne yazık ki, bazı formlarımız oldukça karmaşık olabilir (örneğin, bir işlem finansmanı sistemi geliştirirken 50-100 form alanları, en kötü durum senaryosu), muhtemelen en iyi tasarım değil, fakat bizim işimiz bunu dikte ediyor. Azure'a yaklaşık 300-400 ms koşuşturma yapacağız. –

İlgili konular