У меня есть модель представления, содержащая массив классов. Модель содержит логическое значение, называемое «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, но я не знаю, как сделать это стоит без каких-либо фактических данных ...
Вот мои модели :
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; }
}
Является ли ваше свойство isJobber наблюдаемым или нет? Похоже, вы используете его взаимозаменяемо. Что-то еще не имеет смысла - если вы toString boolean, это должно быть «false», а не «False», не могли бы вы создать jsFiddle для воспроизведения ошибки, которую вы имеете? –
Вы используете нокаут для отладки? Если это так, я рекомендую использовать Glimpse вместо этого, поскольку Knockout вводит совершенно новый слой с собственным потенциалом для ошибок. Glimpse позволит вам увидеть свойства, возвращенные из вашей модели представления. Если вы только проверяете начальное состояние модели, это путь.Если у вас возникли проблемы с состоянием модели, возвращаемой с вашего контроллера MVC, можете ли вы также опубликовать свою модель C#? –
Нет, на странице, которая заполнена (из GoalViewModel), есть множество полей, где пользователь может редактировать и видеть, что другие значения изменяются «на лету», поэтому используется Knockout. – ganders