Aralık veri ek açıklaması özniteliğini kullanarak bir minimum ancak maksimum ondalık sayı belirtmek nasıl?


154

Fiyat için bir ondalık alanın> = 0 olması gerektiğini belirtmek isterim, ancak gerçekten bir maksimum değer empoze etmek istemiyorum.

Şimdiye kadar elimde olan şey ... Bunu yapmanın doğru yolunun ne olduğundan emin değilim.

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }

Elbette bu bir veritabanına giriyorsa, seçilen veritabanı türüne göre izin verilen maksimum sayıyı belirtmeniz gerekir mi? Aksi takdirde, bu sayı aşılırsa kötü bir istisna elde edersiniz
Coops

Yanıtlar:


236

Bunun gibi bir şeye ne dersiniz:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]

Bu, aradığınız şeyi yapmalı ve dizeleri kullanmaktan kaçınabilirsiniz.


1
Bunu Int32 (Int32.MaxValue) için kullandım ve sorun değil, teşekkürler!
Bronek

16
Yine de aptalca bir doğrulama mesajı gösteriyor :(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Piotr Kula

16
@ppumkin Använd ErrorMessage, yani [Aralık (0.0, Double.MaxValue, ErrorMessage = "burada
hatanız

Teşekkürler Jacob. Mükemmel cevap!
pim

1
@ppumkin, hata mesajlarını özelleştirmek için DataAnnotationsModelValidator sınıfından devralır
Alexander

92

İpin güzel görünmesi konusunda endişeleriniz varsa, bunu yapabilirsiniz:

    [Range(0, Double.PositiveInfinity)]

Bu, şu varsayılan hata mesajına sahip olacaktır:

SuchAndSuch alanı 0 ile Infinity arasında olmalıdır.


11
Bu, buradaki en iyi cevap IMHO, uzantı yok, görünüşte rastgele dizeler / sayılar, özel kod yok ve makul derecede mantıklı bir hata mesajı.
Vitani

43

Maksimum değeri manuel olarak girmekten başka seçenek yok gibi görünüyor. Bunu belirtmenize gerek olmayan bir tür aşırı yük olduğunu umuyordum.

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }

15
Bu kod berbat görünüyor. Ben kullanarak öneririm dataannotationsextensions.org Nuget yoluyla ve @Nicolai Schlenzig cevap olarak. Kullanım [Min(0)]- Bu ayrıca daha iyi bir doğrulama mesajına sahiptir. Cevabınızı güncellemenizi öneririm
Piotr Kula

OP fikrini değiştirmediği için buradaki en iyi cevapla aynı olacak şekilde güncelledim lol
Worthy7

Yukarıdaki cevaplar (@Jordan ve @Jacob) çok daha uygun. Özellikle Price hakkında konuştuğumuz için. Çoğu zaman işlemlerin ondalık değerlerle yapılması gerektiğini anlıyorum ama 1.234 dolar fiyat yok veya en azından çoğu zaman bunu kullanıcıya göstermek istemiyorsunuz.
Anastasios Selmanis

@AnastasiosSelmanis, sana katılıyorum, "ama 1.234 dolar fiyat yok" dediğinizde kısmı bekliyorum. USD'yi varsayıyorsunuz ve o zaman bile, bunu döviz için kullandığınızda (burada OP tarafından belirtilmese de), USD daha fazla ondalık sayıya gider. =)
RoLYroLL

35

Kullanabilirsiniz:

[Min(0)]

Bu, gerekli minimum 0 (sıfır) değerini empoze edecek ve maksimum değer olmayacaktır.

Bunu kullanmak için DataAnnotationsExtensions gerekir .


9
Hayır bunun doğru olduğunu sanmıyorum. Standart MVC3 çerçevesinin bir parçası değildir, Data Annotations Extensions dataannotationsextensions.org'dandır . Lütfen bir MSDN bağlantısı sağlayın.
Bernie White

1
HAYIR - MVC 3 :( Ama bunun kütüphanenin kesinlikle DEĞİL parçası herhangi bir şekilde :) olması iyi bir uzantısıdır
Piotr Kula

1
MVC3'ün bir parçası değil ama önemli değil. İstemci tarafında doğrulama istiyorsanız, DataAnnotationsExtensions.MVC3 paketini kullanmanız yeterlidir. Bu iki paket nuget'te mevcuttur. Aptalca bir hata mesajınız olmadığından veya pozitif tamsayıyı veya ondalık sayıları her doğrulamak istediğinizde hata mesajını yeniden tanımlamanız gerekmediğinden (oldukça yaygındır) bunun en iyi yaklaşım olduğunu düşünüyorum.
gentiane

23

Fiyatlarla çalışıyorsanız, hiçbir şeyin 1 trilyon dolardan fazlaya mal olmayacağını güvenle varsayabilirsiniz.

Kullanırım:

[Range(0.0, 1000000000000)]

Veya gerçekten ihtiyacınız varsa, değerini girin Decimal.MaxValue(virgül olmadan):79,228,162,514,264,337,593,543,950,335

Zimbabveli değilseniz bunlardan biri işe yarayacaktır.


7
Neden sadece değil [Range(0.0,Decimal.MaxValue)]?
Coops

5
Derlenmeyecek, Decimal.MaxValue sabit değildir.
John Farrell

Bu sabit bir sıkıntıdır, hata metni için bir kaynak dosyasına başvurmak daha kolay değildir
Coops

4
Şimdi para biriminin Yen ya da başka bir şey değil dolar olduğunu varsayıyorsunuz.
Fred

1
@jfar Decimal.MaxValue bir sabittir. Sadece Range'in bir ondalık sayıya uyacak aşırı yükü yoktur.
Ε Г И І И О

11

Özel doğrulama kullanabilirsiniz:

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public int IntValue { get; set; }

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public decimal DecValue { get; set; }

Doğrulama yöntemleri türü:

public class ValidationMethods
{
    public static ValidationResult ValidateGreaterOrEqualToZero(decimal value, ValidationContext context)
    {
        bool isValid = true;

        if (value < decimal.Zero)
        {
            isValid = false;
        }

        if (isValid)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(
                string.Format("The field {0} must be greater than or equal to 0.", context.MemberName),
                new List<string>() { context.MemberName });
        }
    }
}

2

Bunun gibi bir şey deneyecektim:

[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]

Bununla birlikte, bunu yapmanın sorunu, derleyicinin izin vermeyen sabit bir ifade istemesidir ((double)0).ToString(). Derleyici olacak almak

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")]

Bunu reddeden kimse, lütfen çözümümün neden zayıf olduğunu veya yardımcı olmadığını düşündüğünüzü açıklar mı? Çünkü herhangi bir açıklama yapmadan sadece olumsuz oy kullanmak hiçbir işe yaramaz.
David T. Macknet

Hata mesajınız "büyük veya eşit" olmalıdır.
Ε Г И І И О

İyi yakalama. Katma.
David T. Macknet

1

Aralığı ile

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]

[Range(typeof(Decimal),"0.0", "1000000000000000000"]

Umarım yardımcı olur


1

[Aralık (0.01,100000000, ErrorMessage = "Fiyat sıfırdan büyük olmalıdır!")]


-1

Ben koyardı decimal.MaxValue.ToString()bu değil bir üst bağlanmış olan eşdeğerdir decmial türü için etkili tavan olduğundan.


5
Sorun şu ki, bu sabit değil. Şu hatayı alırsınız: Bir öznitelik bağımsız değişkeni sabit bir ifade, typeof ifadesi veya bir öznitelik parametresi türünün dizi oluşturma ifadesi olmalıdır
user169867

Aşağıda belirttiğim gibi, ama görünüşe göre birisi tarafından takdir edilmedi.
David T. Macknet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.