我正在尝试创建一个ViewModel,它在我的View中比它所基于的模型更容易使用(这是一种高度分层的数据类型)。我发现自己写的Razor代码看起来像:
<label asp-for="Audit.Stages.First(s => s.Stage == AuditStageType.INITIAL_REVIEW).Decision">Initial Recommendation: </label>
@(Model.Audit.Stages.First(s => s.Stage == AuditStageType.INITIAL_REVIEW).Decision?.Recommendation ?? ViewBag.Empty)
这是一个痛苦,所以我一直在努力使模型变平,但我需要确保初始化不会以破坏模型假设的方式发生。
所以,在我的ViewModel中,我正在尝试:
public Audit Audit { get; private set; }
/// <summary>
/// Gets the Initial Review stage from the Audit object
/// </summary>
public AuditStage Stage1
{
get
{
return Audit.Stages.First(s => s.Stage == AuditStageType.INITIAL_REVIEW);
}
}
然后在我的基础模型中:
public class Audit : EntityBase
{
public Audit()
{
CurrentStatus = null;
EmpPhone = null;
Stages = new List<AuditStage>()
{
new AuditStage()
{
Stage = AuditStageType.INITIAL_REVIEW
}
};
}
//so that the Stages object can't get reset
public ICollection<AuditStage> Stages { get; private set; }
}
我希望允许对象初始值设定项初始化对象的其他部分,例如:
SurveyAnswers sa = surveyAnswersRepository.GetById(id);
Employee emp;
try
{
emp = employeeRepository.GetById(sa.Sme.SiteUser.EmployeeId ?? 0);
}
catch (Exception)
{
emp = null;
}
AuditViewModel model = new AuditViewModel()
{
//all of these lines throw an error of "An object reference is required
//for the non-static field, method, or property 'Audit.X'"
Audit.Answers = sa,
Audit.CurrentStatus = emp?.CurrentStatus,
Audit.EmpPhone= emp?.PhoneNumber
};
因此,看起来private set
使我无法以任何方式访问对象初始值设定项中的对象。
对于每种可能的信息组合,我宁愿使用对象初始化器而不是单独的构造器(如emp和sa;还有其他)。
我宁愿使用对象初始化器而不是必须调用
model.Audit.Answers = sa;
model.Audit.PayGrade = emp?.PayGrade;
model.Audit.PayStep = emp?.PayStep;
初始化之后,因为将它们全部放在同一个代码块中会更清晰。
有没有办法可以使用对象初始值设定项来访问我想要防止错误初始化的属性的属性?我是否认为这一切都错了?这完全有可能;我还是C#的新手,特别是MVC。