0

null の厳密な型のプロパティ値をテストし、null の場合は "N/A" などの置換値を取得し、それ以外の場合は元のコード行を実行できる拡張メソッドを作成したいと考えています。明示的なバージョンは次のとおりです。

            @(Model.Birthdate == null ? "N/A" : Model.Birthdate.Value.Date.ToString("dd/MM/yyyy"))

このテストをビュー内のすべての値に適用するのではなく、次のような拡張メソッドを使用したより雄弁なアプローチがあるかどうか疑問に思っていました。

@(Model.Birthdate.Value.TestForNull("N/A"))..... I am trying to write my idea out and am not sure it is possible with the date formatting as well! Perhaps one has to do it line by line.
4

3 に答える 3

2

ヘルパーの一部として使用する単純な拡張メソッドを作成できます。

public static class DateTimeExtensions
{
    public static string ToStringOr(this DateTime? dateTime, string value)
    {
        return dateTime.HasValue ? dateTime.ToString() : value;
    }
}

// Your model
public class Person
{
    public DateTime? Dob { get; set; }
}

次に、ビューで使用します。

@Model.Dob.ToStringOr("N/A");
于 2013-06-25T01:11:05.870 に答える
1

代わりに、このロジックをモデルで解決します。N/A または日付文字列を返す文字列プロパティで条件をラップできます。

于 2013-06-25T01:04:38.393 に答える
0

期待どおりにそれを行うことはできません。「元の」行は null ポインターにアクセスする可能性があるため、三項演算子が残ります。本当に拡張機能が必要な場合 (すべてのオブジェクトを汚染するため、拡張しないことをお勧めします)、次のことができます。

public static TOutput FallbackTo<TInput, TOuput>(this TInput input, Func<TInput, TOutput> execute, TOutput fallback) 
    where TInput : class
{
    return input!= null ? execute(input) : fallback;
}

public static TOutput FallbackTo<TInput, TOuput>(this Nullable<TInput> input, Func<TInput, TOutput> execute, TOutput fallback) 
{
    return input.HasValue != null ? execute(input.Value) : fallback;
}

または、より広範で合理化されたバージョン:

public static TOutput FallbackTo<TInput, TOutput>(this TInput input, Func<TInput, TOutput> execute, TOutput fallback)
{
    try 
    {
        return execute(input);
    }
    catch(ArgumentNullException) 
    {
        return fallback;
    }
}

あなたの場合、次のことができます:

@(Model.Birthdate.FallbackTo(d => d.Date.ToString("dd/MM/yyyy"), "N/A"))
于 2013-06-25T01:19:36.443 に答える