一种扩展方法来处理Razor中的Null属性值?

时间:2013-06-25 01:01:21

标签: c# asp.net-mvc-3 c#-4.0 asp.net-mvc-4

我想创建一个扩展方法,可以测试null的强类型属性值,如果为null则取一个替换值,即“N / A”,否则运行原始代码行。显式版本是:

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

我没有将此测试应用于视图中的所有值,而是想知道是否有更多使用扩展方法的elconnt方法,有点像:

@(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.

3 个答案:

答案 0 :(得分:2)

您可以创建一个简单的Extension方法,作为Helpers的一部分使用。

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");

答案 1 :(得分:1)

我会在模型中解决这个逻辑。 您可以将条件包装在返回N / A或日期字符串的字符串属性中。

答案 2 :(得分: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"))