2015-08-04 22 views
5

MVC-projemde farklı özel doğrulama öznitelikleri var. Bunlardan biri, bir mülkün değerini başka bir mülkün değerine karşı kontrol etmektir. Birçok maddelerde belirtildiği gibiC# MVC - Modele bağlı olarak dinamik olarak özellik adı getir

, ben dönmeden ModelClientValidationRule nesneye

result.ValidationParameters.Add("otherproperty", _otherPropertyHtml); 
result.ValidationParameters.Add("comparetype", _compareType); 
result.ValidationParameters.Add("equalitytype", _equalityType); 

gibi bir şey ekleyin.

Şimdiki sorum şu, bu, eğer - benim denetlemem gerekirse - başka bir nesnede kapsüllenmişse, doğrulama çalışmaz.

Ben

gibi bir şey oluşturursanız o

data-val-otherproperty="ValueTwo" 

Sorunum içindir işler gibi

@Html.TextBoxFor(m => m.ValueOne) 
@Html.TextBoxFor(m => m.ValueTwo) 

doğrulama iyi çalışır Bu isimlerle iki metin kutularının verecek

@Html.TextBoxFor(m => m.IntermediateObject.ValueOne) 
@Html.TextBoxFor(m => m.IntermediateObject.ValueTwo) 

aşağıdaki IntermediateObject_ValueOne ve IntermediateObject.ValueTwo. Ama yine de ilk metin kutusu için data-val-otherproperty = "ValueOne".

data-val-otherproperty'un her zaman diğer özelliğin doğru adı olduğu nasıl elde edilebilir?

Düşüncelerim, HtmlHelper <> .NameFor (m => ...) veya yansımayı kullanan bir şeydir.

Güncelleme 1 -

gibi bir şey

public class MyModel 
{ 
    [CustomCompareToOther("ValueOTwo", CompareType.NotEqual, PropertyType.String)] 
    public string ValueOne { get; set; }  

    [CustomCompareToOther("ValueTwo", CompareType.NotEqual, PropertyType.String)] 
    public string ValueTwo { get; set; } 
} 

olacağını modeli düzeyinde yorumlarla tarafından

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = false)] 
public class CustomCompareToOther : ValidationAttribute, IClientValidatable 
{ 
    // private backing-field 
    private readonly string _otherPropertyName; 

    // constructor 
    public OemCompareToOther(string otherPropertyName) 
    { 
     _otherPropertyName = otherPropertyName; 
    } 

    // implementation of IClientValidatable 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var result = new ModelClientValidationRule 
      { 
       ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
       ValidationType = "customcomparetoother" 
      }; 

     // add the property-name so it is known when rendered for client-side validation 
     result.ValidationParameters.Add("otherproperty", _otherPropertyHtml); // here I would need IntermediateObject.ValueTwo instead of only ValueTwo 

     yield return result; 
    } 
} 

Kullanımı istenen Ve ben Görünüm koymak ne olacağı gibi kod eklendi

return View(new ViewModel()). Yani, oluşturulan HTML içinde ben bir giriş

<input type="text" name="IntermediateObject_ValueOne" id="IntermediateObject.ValueOne" data-val-customcomparetoother-otherpropertyname="ValueTwo" /> 
<input type="text" name="IntermediateObject_ValueTwo" id="IntermediateObject.ValueTwo" data-val-customcomparetoother-otherpropertyname="ValueOne" /> 

olurdu ama öyle javascript doğrulama doğru diğer özelliği getirebilir html

<input type="text" name="IntermediateObject_ValueOne" id="IntermediateObject.ValueOne" data-val-customcomparetoother-otherpropertyname="IntermediateObject.ValueTwo" /> 
<input type="text" name="IntermediateObject_ValueTwo" id="IntermediateObject.ValueTwo" data-val-customcomparetoother-otherpropertyname="IntermediateObject.ValueOne" /> 

gerekir.

+0

neden bunu yapmak isteyeyim senin kullanarak açıklamalara System.ComponentModel.DataAnnotations ad eklemeyi unutmayın?çok benzerliği olan birden fazla modeliniz varsa, bunları bir üst sınıfı paylaşmanız gerekir, o zaman bu üst öğeye göre bir görünüm oluşturabilirsiniz. – DLeh

+0

"Yanıtım", "İstek" i içeren bir istek/yanıt yapısı oluşturuyorum. Bundan sonra yayınlanacak. Yani, 'View'imde' Html.TextBoxFor'unu oluşturacağım (m => m.Request.ValueOne) '. Tabii ki, her zaman '' İstek '' ekleyebilirim ama ben sihirli dizgilerden hoşlanmıyorum, tüm parçalar şu anda istek/cevap tabanlı değildir ve eğer isim 'Request' - 'RenamedRequest' arasında değişirse, hiçbir şey işe yaramaz – KingKerosin

+0

Tümünü göster Özellik kodunuz –

cevap

2

[Compare("PropertyName")] Veri Açıklaması'nu kullanabilirsiniz. senin Görünüm Modeli

Örnek:

[Display(Name = "New Password")] 
[DataType(DataType.Password)] 
public string NewPassword { get; set; } 

[Display(Name = "Confirm Password")] 
[DataType(DataType.Password)] 
[Compare("NewPassword")] 
public string PasswordConfirmation { get; set; } 

Sadece

+0

(Benim için) olarak ekledim, şu anda "CompareAttribute" seçeneğine sahip olduğum özel öznitelikten değiştirme seçeneği yok – KingKerosin

İlgili konular