Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在初始化中访问私有集属性的属性_C#_Razor_Asp.net Core Mvc - Fatal编程技术网

C# 在初始化中访问私有集属性的属性

C# 在初始化中访问私有集属性的属性,c#,razor,asp.net-core-mvc,C#,Razor,Asp.net Core Mvc,我正在尝试创建一个ViewModel,它在我的视图中比它所基于的模型(一种高度层次化的数据类型)更容易使用。我发现自己编写的Razor代码如下所示: <label asp-for="Audit.Stages.First(s => s.Stage == AuditStageType.INITIAL_REVIEW).Decision">Initial Recommendation:&nbsp;</label> @(Model.Audit.Stages.First

我正在尝试创建一个ViewModel,它在我的视图中比它所基于的模型(一种高度层次化的数据类型)更容易使用。我发现自己编写的Razor代码如下所示:

<label asp-for="Audit.Stages.First(s => s.Stage == AuditStageType.INITIAL_REVIEW).Decision">Initial Recommendation:&nbsp;</label>
@(Model.Audit.Stages.First(s => s.Stage == AuditStageType.INITIAL_REVIEW).Decision?.Recommendation ?? ViewBag.Empty)
因此,
私有集
似乎阻止我在对象初始值设定项中以任何方式访问对象。 我更愿意使用对象初始值设定项,而不是单独的构造函数来处理我可能得到的信息的每个可能的组合(比如emp和sa;还有其他的)

我宁愿使用对象初始值设定项,也不必调用

model.Audit.Answers = sa;
model.Audit.PayGrade = emp?.PayGrade;
model.Audit.PayStep = emp?.PayStep;
在初始化之后,因为将其全部放在同一个代码块中更干净


有没有一种方法可以使用对象初始值设定项来访问我要保护的属性的属性,以防止其初始化错误?我是否完全错了?这是完全可能的;我对C#尤其是MVC还是个新手。

保护属性的属性不受错误初始化的影响不是你的责任。类的任务是保护自己的属性不受错误初始化的影响<代码>审核应该有一个构造函数,该构造函数采用适当的参数并进行适当的验证。为什么创建
审核的任何人都必须重新执行验证?任何创建
审核
的代码都必须经过一点:
审核
的构造函数。因此,初始化
审核所需的任何东西都应该放在那里。没有人需要做任何特别的事情才能得到它,也没有人会忘记给它打电话。你正在考虑的编程相当于告诉你的室友和他的女朋友分手。不要插手。@EdPlunkett你说的听起来像是我应该让
Audit
中的所有东西都有私有setter,不要让任何人在构造函数之外进行额外的初始化。因为这个类是我们团队的公共API的一部分,所以要防止破坏别人的代码需要做很多工作。一点也不需要。我的意思是,如果您需要“保护属性不受错误初始化的影响”,那么第一个选择是在构造函数中。
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
};
model.Audit.Answers = sa;
model.Audit.PayGrade = emp?.PayGrade;
model.Audit.PayStep = emp?.PayStep;