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 odata-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 şeypublic 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.
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
"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
Tümünü göster Özellik kodunuz –