Я работаю с приложением ASP.NET Forms, где (для простоты) я добавил свойства модели [TotalService]
и [PurchasedorReinstatedService]
где я сохраняю значение из другой модели в это свойство для использования в первой модели.
Затем я пытаюсь ссылаться на это свойство Model и устанавливать для него свойство ASP Label .Text
. Проблема в том, что я получаю NullReferenceExceptions, в частности:
An exception of type 'System.NullReferenceException' occurred in PROJECT.dll but was not handled in user code
Additional information: Object reference not set to an instance of an object.
Это мой пользовательский контроль, где я получаю ошибку:
using PROJECT.Models.Default;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PROJECT.Classes;
namespace PROJECT.CustomControls.Default
{
public partial class YearsOfService : System.Web.UI.UserControl
{
public List<Years_Of_Service> yos { get; set; }
public Years_Of_Service_Data yosd { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ApplyData();
}
}
private void ApplyData()
{
salaryGridView.DataSource = yos;
salaryGridView.DataBind();
if (yosd.YearsOfService.OrderByDescending(y => y.TotalService).FirstOrDefault().ToString() != null)
{
creditSalLabel.Text = yosd.YearsOfService.OrderByDescending(y => y.TotalService).FirstOrDefault().ToString();
}
else
{
creditSalLabel.Text = String.Empty;
}
//creditSalLabel.Text = yosd.YearsOfService.OrderByDescending(y => y.TotalService).FirstOrDefault() != null ? yosd.YearsOfService.OrderByDescending(y => y.TotalService).FirstOrDefault().ToString() : String.Empty;
//purchaseCreditLabel.Text = yosd.YearsOfService.OrderByDescending(y => y.PurchasedorReinstatedService).FirstOrDefault() != null ? yosd.YearsOfService.OrderByDescending(y => y.PurchasedorReinstatedService).FirstOrDefault().ToString() : string.Empty;
}
}
}
Это моя модель Years_Of_Service
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace PROJECT.Models.Default
{
public class Years_Of_Service
{
public int Year { get; set; }
public string FiscalYear
{
get
{
return Year + "-" + (Year + 1);
}
}
public decimal ServiceCredited { get; set; }
public decimal Salary { get; set; }
public string CoveredEmployer { get; set; }
// New properties added for Label Values
public string TotalService { get; set; }
public string PurchasedorReinstatedService { get; set; }
}
}
Years_Of_Service_Data
Модель:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace PROJECT.Models.Default
{
public class Years_Of_Service_Data
{
public List<Years_Of_Service> YearsOfService { get; set; }
}
}
и это бит кода в моем помощнике, где я читаю результаты моей базы данных (Oracle Data Reader
) в моей модели (я подтвердил, что значения правильно добавляются в свойства TotalService
& PurchasedorReinstatedService
):
while (odr.Read())
{
Years_Of_Service yosRecord = new Years_Of_Service();
yosRecord.Year = gh.GetSafeInt(odr, 0);
yosRecord.ServiceCredited = gh.ConvertNullDecimal(odr.GetValue(1));
yosRecord.Salary = gh.ConvertNullDecimal(odr.GetValue(2));
yosRecord.CoveredEmployer = gh.GetSafeString(odr, 3);
// Use the Default Info Model Class - At_A_Glance Model properties to fill these properties for text labels.
yosRecord.TotalService = defInfoOasis.At_A_Glance.CreditTotal.ToString("N5");
yosRecord.PurchasedorReinstatedService = defInfoOasis.At_A_Glance.TotalPurchase.ToString("N5");
yos.Add(yosRecord);
}
Теперь мне нужно добавить ANY из объектов YearsOfService.yos
в список List<Years_Of_Service> yosd
. У кого-нибудь есть мысли о том, как это сделать?
Ниже показано, как я устанавливаю модели, перечисленные в разделе get/set в моем CustomControls:
private void GetDefaultInfoOasis()
{
DefaultInformation dio = new DefaultInformation);
DefaultHelper dh = new DefaultHelper(Convert.ToInt32(Session["memberAccountId"]));
dio = dh.GetDefaultInformation();
// sets the Model Properties on the Custom Controls to that returned by [dio]
AtAGlance.aag = dio.At_A_Glance;
AnnualSalary.a_s = dio.Annual_Salary;
YearsOfService.yos = dio.Years_Of_Service;
// Attempting to add all or even 1 of the [dio.Years_Of_Service] or [YearsOfService.yos] (same thing) to the [YearsOfService.yosd] list:
// Attempt 2: NULL Reference Exception
YearsOfService.yosd.YearsOfService.Add(YearsOfService.yos.First());
// Attempt 1: NULL Reference Exception
YearsOfService.yosd.YearsOfService.Add(new Years_Of_Service { Salary = dio.Years_Of_Service.First().Salary, Year = dio.Years_Of_Service.First().Year, ServiceCredited = dio.Years_Of_Service.First().ServiceCredited, CoveredEmployer = dio.Years_Of_Service.First().CoveredEmployer, TotalService = dio.Years_Of_Service.First().TotalService, PurchasedorReinstatedService = dio.Years_Of_Service.First().PurchasedorReinstatedService });
BeneficiaryDesignation.lb = dio.Beneficiaries;
}
У кого-нибудь есть идея относительно того, чего я не вижу/делаю неправильно? Вероятно, это длинный окольный способ получить то, что я хочу (в настоящее время добавляя то же значение для [TotalService] и [BuyasedorReinstatedService] ко всем моим записям [Years_Of_Service]), но это было самое простое, что я мог придумать (без использования глобальных переменных в моем Помощнике...)
Я не вижу, где вы инициализируете YearsOfService.yosd
Если это свойство не настроено на новый объект, перед выполнением этого YearsOfService.yosd.YearsOfService.Add(...)
то он потерпит неудачу.
YearsOfService.ysod
, я устанавливаю глобальное значение, указанное в моем файле конструктора пользовательских YearsOfService.ysod
управления (не совсем уверен в этом дизайне, просто следуя protected global::PROJECT.CustomControls.Default.YearsOfService YearsOfService;
коллег): protected global::PROJECT.CustomControls.Default.YearsOfService YearsOfService;
,
Вместо того, чтобы пытаться бороться с List<Years_Of_Service>.First()
в Years_Of_Service_Data
, вместо этого я создал обычный Year_Of_Service
для своего пользовательского Year_Of_Service
управления, чтобы иметь доступ к:
namespace PROJECT.CustomControls.Default
{
public partial class YearsOfService : System.Web.UI.UserControl
{
public List<Years_Of_Service> lyos { get; set; }
public Years_Of_Service y_o_s { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ApplyData();
}
}
private void ApplyData()
{
salaryGridView.DataSource = lyos;
salaryGridView.DataBind();
if (y_o_s.TotalService.ToString() != null)
{
creditSalLabel.Text = y_o_s.TotalService.ToString();
}
else
{
creditSalLabel.Text = String.Empty;
}
if (y_o_s.PurchasedorReinstatedService.ToString() != null)
{
purchaseCreditLabel.Text = y_o_s.PurchasedorReinstatedService.ToString();
}
else
{
purchaseCreditLabel.Text = String.Empty;
}
}
}
}
Моя страница по умолчанию, использующая мой пользовательский контроль:
private void GetDefaultInformation()
{
DefaultInformation dio = new DefaultInformation();
DefaultHelper dh = new DefaultHelper(Convert.ToInt32(Session["memberAccountId"]));
dio = dh.GetDefaultInformation();
AtAGlance.aag = dio.At_A_Glance;
AnnualSalary.a_s = dio.Annual_Salary;
YearsOfService.lyos = dio.Years_Of_Service;
YearsOfService.y_o_s = dio.Years_Of_Service.First();
}
YearsOfService.yosd.YearsOfService.Add(YearsOfService.yos.First());
yosd не статичен, это не сработает. Вы должны инициализировать YearsOfservice, а затем сделать это. Йос также не стоит на месте