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

你不能按照你期望的那样做。因为“原始”行可能会访问空指针,所以它给您留下了三元运算符。如果你真的想要一个扩展(我不建议这样做,因为它会污染所有对象),你可以这样做:

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 回答