2013-12-23 5 views
0

У меня есть модель представления, содержащая массив классов. Модель содержит логическое значение, называемое «isJobber». Массив в этой модели устанавливает несколько более логических значений, основанных на значении «isJobber» (плюс несколько более логических значений), чтобы определить, могут ли некоторые конкретные поля редактироваться пользователем.Неверное значение свойства модели

Я видел некоторые несоответствия с редактируемыми/нередактируемыми полями, поэтому я добавил свойство «debug» для каждого элемента в моем массиве внутри модели.

Свойство отладки имеет:

debug = isJobber.ToString(); 

И моя модель имеет свойство "isJobber". Модель возвращает true, а свойство debug возвращает false.

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

Как это возможно. Значение isJobber NEVER изменяется с момента его использования для заполнения массива до момента его заполнения в родительской модели. Вот весь код, в полном объеме:

var isJobber = _storeRepo.Query().FirstOrDefault(s => s.OwnerID == ownerId).Jobber; 
var goalViewModel = goals.Select(g => new GoalViewModel { 
    GoalId = g.GoalId, 
    MonthName = GetMonth(g.Month), 
    Month = g.Month, 
    LYMonthSales = g.LYMonthSalesAdjusted, 
    LYMonthSalesActual = g.LYMonthSalesActual, 
    CYMonthGoal = g.CYMonthGoal, 
    CYMonth = g.CYMonthAdjusted, 
    CYMonthActual = g.CYMonthActual, 
    ExpoDollars = g.ExpoDollars, 
    LYSalesEditable = isJobber && (currentDate.Year < 2014 || (activeMonth == null && currentDate.Month <= g.Month) || activeMonth <= g.Month), 
    CYSalesEditable = isJobber && currentDate.Year >= 2014 && activeMonth != null && activeMonth == g.Month, 
    GoalEditable = (lastProcessedMonth == null || lastProcessedMonth < g.Month), 
    Debug = "currentDate: " + currentDate.ToShortDateString() + "; isJobber: " + isJobber + "; activeMonth: " + activeMonth + "; Month: " + g.Month + "; lastProcessedMonth: " + lastProcessedMonth 
}).ToList(); 

return View(new EarnbackModel { 
    EnrollmentId = enrollment.EnrollmentId, 
    CustomerName = enrollment.Customer.CustomerName, 
    TotalPackagePrice = packages.Where(p => p.CancellationDate == null).Sum(p => p.Price), 
    EarnbackCap = enrollment.EarnbackCap ?? 0, 
    EarnbackCapMax = isJobber ? 1000000m : 5000m, 
    DefaultGoalPercent = 7, 
    Ars = arSelections.ToList(), 
    Goals = goalViewModel, 
    IsJobber = isJobber, 
    AvailableStores = stores, 
    LastProcessedMonth = lastMonth, 
}); 

Вот выход из хромированных инструментов разработчика:

viewModel.IsJobber() 
true 
viewModel.Goals()[0].Debug() 
"currentDate: 12/22/2013; isJobber: False; activeMonth: ; Month: 1; lastProcessedMonth: " 

Одна вещь, которую я заметил, с помощью инструментов разработчика Chrome, наш сервер, этот сайт думает, что это 12/22 /2013...don't думаю, что это имеет какое-либо влияние на мою стоимости недвижимости, но стоит отметить ...

В ответ на PW Cad замечании/вопрос: Вот cshtml код нокаута материала. Отвечает ли это на вопрос о том, что isJobber является наблюдаемым? Так как это в модели представления, не делает ли это наблюдаемым()? Кстати, я начну работать над jsFiddle, подумал, что я никогда раньше этого не делал.

Кроме того, это прекрасно работает в моем развитии (localhost) и тестировании веб-сайтов. Только производство не работает ...

var raw = @Html.Json(Model); 
    viewModel = ko.mapping.fromJS(raw); 

Вот jsFiddle, но я не знаю, как сделать это стоит без каких-либо фактических данных ...

jsFiddle

Вот мои модели :

public class EarnbackModel 
    { 
     public EarnbackModel() 
     { 
      Ars = new List<ArSelectionViewModel>(); 
      Goals = new List<GoalViewModel>(); 
      AvailableStores = new List<StoreViewModel>(); 
     } 

     public int EnrollmentId { get; set; } 
     public string CustomerName { get; set; } 
     public decimal TotalPackagePrice { get; set; } 
     public decimal EarnbackCap { get; set; } 

     public decimal EarnbackCapMax { get; set; } 

     public decimal DefaultGoalPercent { get; set; } 

     public IList<ArSelectionViewModel> Ars { get; set; } 
     public IList<GoalViewModel> Goals { get; set; } 

     public bool IsJobber { get; set; } 

     public IList<StoreViewModel> AvailableStores { get; set; } 

     public NewARViewModel NewAr { get; set; } 

     public int LastProcessedMonth { get; set; } 
    } 

public class GoalViewModel 
    { 
     public bool MonthClosed { get; set; } 

     public int GoalId { get; set; } 
     public string MonthName { get; set; } 
     public int Month { get; set; } 
     public decimal LYMonthSales { get; set; } 
     public decimal LYMonthSalesActual { get; set; } 
     public decimal CYMonthGoal { get; set; } 
     public decimal? CYMonth { get; set; } 
     public decimal? CYMonthActual { get; set; } 
     public decimal? ExpoDollars { get; set; } 

     public bool LYSalesEditable { get; set; } 
     public bool CYSalesEditable { get; set; } 
     public bool GoalEditable { get; set; } 

     public string Debug { get; set; } 
    } 
+0

Является ли ваше свойство isJobber наблюдаемым или нет? Похоже, вы используете его взаимозаменяемо. Что-то еще не имеет смысла - если вы toString boolean, это должно быть «false», а не «False», не могли бы вы создать jsFiddle для воспроизведения ошибки, которую вы имеете? –

+0

Вы используете нокаут для отладки? Если это так, я рекомендую использовать Glimpse вместо этого, поскольку Knockout вводит совершенно новый слой с собственным потенциалом для ошибок. Glimpse позволит вам увидеть свойства, возвращенные из вашей модели представления. Если вы только проверяете начальное состояние модели, это путь.Если у вас возникли проблемы с состоянием модели, возвращаемой с вашего контроллера MVC, можете ли вы также опубликовать свою модель C#? –

+0

Нет, на странице, которая заполнена (из GoalViewModel), есть множество полей, где пользователь может редактировать и видеть, что другие значения изменяются «на лету», поэтому используется Knockout. – ganders

ответ

2

Если он работает в разработке, но не в производстве, то казалось бы, что либо что-то изменяется при помощи конфигурации Release или есть сома что-то не так с производственной средой или пакетом развертывания. Возможно, попробуйте упаковать и перераспределить. Если это не работает, попробуйте выполнить развертывание на другом сервере.

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