我想创建一个扩展方法,可以测试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.
答案 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"))