我正在尝试了解Orchard MVC应用程序。我看到以下代码,但无法理解它在做什么。有人可以解释一下这个:
User.As<UserPart>().Record.UserName = value;
装置?
public class UserEditViewModel {
[Required]
public string UserName {
get { return User.As<UserPart>().Record.UserName; }
set { User.As<UserPart>().Record.UserName = value; }
}
[Required]
public string Email {
get { return User.As<UserPart>().Record.Email; }
set { User.As<UserPart>().Record.Email = value; }
}
public IContent User { get; set; }
}
答案 0 :(得分:0)
在我看来,这个viewmodel用于编辑当前登录的用户详细信息。
的第1部分
User.As<UserPart>().Record.UserName = value;
是User.As<UserPart>()
- 我认为类似于UserPart
的C#对象是由User类上的静态方法调用创建的,并且该对象可能包含已登录的用户详细信息。我怀疑它访问HttpContext.Current
或ControllerContext
的Request属性,以了解当前用户是谁并获取其详细信息。获取表示当前登录用户UserPart
的{{1}}对象后,只需在对象上设置传入值。
.Record.UserName = value
是C#中所有set方法的隐式参数。
ViewModel的setter通常在actioninvoking之前的Request模型绑定期间绑定模型时调用。并且在渲染视图时通常会调用getter。
如果您仍然觉得难以理解,请查看Orchid Documentation或Source Code本身
答案 1 :(得分:0)
不知道来源,看起来As<type>()
的来电相当于obj as type
即。在这种情况下,对象将被转换为类型type
- UserPart
。因此User
被定义为IContent
,但在这种情况下,假设实现该接口的类的类型为UserPart
,并且可以安全地转换为该类型。
因此User.As<UserPart>()
会返回UserPart
类型的对象,该对象可能包含属性Record
。
对我来说这似乎很奇怪,因为如果你将实现绑定到类型IContent
,为什么要抽象UserPart
接口,但同样,我不知道代码,它可能很有意义在更大的背景下。
编辑:我说绑定实现,因为如果基础类不类型为User.As<UserPart>()
,大概UserPart
可能会返回null,并且没有检查。< / p>