2015-04-30 3 views
0

В моей модели просмотра Я нахожу идентификатор, который передается для ссылки редактирования. Если я использую поля в этой модели, иногда получаю ошибку, если значение равно null, а иногда нет. Я получаю сообщение об ошибке в том же поле, nvarchar (100) и другие поля, nchar (10), я не получаю ошибку. Я не знаю, почему, кроме, возможно, nchar (10) nulls обрабатываются по-разному?MVC 4 C# .net 4 Razor Controller Edit Viewmodel null value

 ViewBag.TimeRec = Time.Min + "-" + Time.Max + 
      "-" + Time.Rate.ToString() + "-" + 
      Time.Description.ToString().Trim(); 

Time.Min и Макс оба нуль, в таблице MSSQL DB они NCHAR (10), описание также нулевая NVARCHAR (100). Когда я меняю его, чтобы проверить описание, а затем заменить его на переменную, содержащую «», ошибка не возникает.

Я выполнил поиск и не нашел ответа. Благодаря

ответ

0

Вы не включили, как ваше отображение из SQL в C#, но как общий случай SQL NCHAR [10] всегда строка из 10 символов, в то время как NVARCHAR (10) - до 10 символов (включая нуль).

Это объясняет разницу между обнуляемой-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() + ...

Я бы, вероятно, исправил это в сопоставлении напрямую, а не заставлял разработчик пользователь помнить об этом каждый раз.

0

вы получите сообщение об ошибке, когда вы делаете .ToString() на Null

0

Я использовал методы расширения для решения этой проблемы в прошлом.

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

Я использую значение прямо из модели в MVC4. Тем не менее, я знаю, что тестировал нуль. В прямой .net (по крайней мере для VB) я всегда мог использовать .ToString() и преобразовал null в пробелы. У меня нет проблем с тестированием нулевого значения, теперь я знаю, просто хотел убедиться, что nchar и nvarchar обрабатываются по-разному. Спасибо

Смежные вопросы