MVC 4 C#.net 4 Razor控制器编辑Viewmodel空值

MVC 4 C#.net 4 Razor控制器编辑Viewmodel空值,c#,sql-server,asp.net-mvc,asp.net-mvc-4,razor,C#,Sql Server,Asp.net Mvc,Asp.net Mvc 4,Razor,在我的Viewmodel中,我查找传递给编辑链接的id。如果我使用该模型中的字段,如果值为null,有时会出现错误,有时则不会。我在同一个字段nvarchar(100)和其他字段nchar(10)上得到一个错误,我没有得到这个错误。我不知道为什么,除了nchar(10)空值可能被区别对待之外 ViewBag.TimeRec = Time.Min + "-" + Time.Max + "-" + Time.Rate.ToString() + "-" +

在我的Viewmodel中,我查找传递给编辑链接的id。如果我使用该模型中的字段,如果值为null,有时会出现错误,有时则不会。我在同一个字段nvarchar(100)和其他字段nchar(10)上得到一个错误,我没有得到这个错误。我不知道为什么,除了nchar(10)空值可能被区别对待之外

        ViewBag.TimeRec = Time.Min + "-" + Time.Max +
            "-" + Time.Rate.ToString() + "-" +
            Time.Description.ToString().Trim();
Time.Min和Max都是null,在mssql DB表中它们是nchar(10),描述也是null nvarchar(100)。当我将其更改为测试描述,然后将其替换为包含“”的变量时,不会引发任何错误


我搜索了一下,没有找到任何答案。谢谢

当您执行此操作时会出现错误。空值上的ToString()使用??(空合并)运算符以避免空引用异常

(Time.Description??"").Trim()
你可以在

我过去曾使用扩展方法来解决这个问题

public static string EmptyIfNull(this object value)
    {
        if (value == null)
            return "";
        return value.ToString();
    }
然后您将能够执行以下操作:

Time.Description.EmptyIfNull()

您可能还想考虑将这些字段的默认值设置为空字符串。那么你就不必担心空值了

下面是迁移的代码

AlterColumn("dbo.TableName", "ColumnName", c => c.String(nullable: false, maxLength: 60, defaultValue: ""));

您没有包括如何从sql映射到C#,但一般情况下,sql nchar[10]始终是一个10个字符的字符串,而nvarchar(10)最多是10个字符(包括null)

这解释了可空nchar与可空nvarchar之间的区别

您可以使用空合并运算符(根据其他答案),也可以添加字符串扩展名,例如:

public static class StringExtensions
{
    public static string TrimNull(this string value)
    {
        if (value == null) return string.Empty;
        return value.Trim();
    }
}
[如果TrimOrEmptyIfNull(匹配类似的CLR IsNullOrWhiteSpace),请适当命名]

然后使用<代码>+Time.Description.TrimNull()+


我可能会直接在映射中修复这一点,而不是强迫UI开发人员每次都记住这一点

我直接使用MVC4中模型的值。不过我知道测试null。在straight.net中(至少在VB中),我始终能够使用.ToString()并将null转换为空格。我测试null没有问题,现在我知道了,只是想确保nchar和nvarchar的处理方式不同。谢谢