我可以在MVC控制器中使用Profile的动态功能吗

本文关键字:Profile 动态 功能 MVC 控制器 我可以 | 更新日期: 2023-09-27 18:30:13

我怀疑这只适用于asp.net页面,但根据这一点:

http://msdn.microsoft.com/en-us/library/2y3fs9xs.aspx

我可以在web.config中定义属性,如下所示:

<profile>
  <properties>
    <add name="PostalCode" />
  </properties>
</profile>

然后继续这样使用它们:

Profile.PostalCode = txtPostalCode.Text;

但这并不能在控制器中为我编译:

public ActionResult Index()
{
  Profile.PostalCode = "codeofpost";
  return View();
}

Profile属于ProfileBase类型,不是动态的,所以我不知道它是如何工作的,但文档中另有说明。

我可以在MVC控制器中使用Profile的动态功能吗

Profile类仅在ASP.NET网站项目中生成,而不在ASP.NET Web应用程序中生成。

在Web应用程序项目中,您需要使用

ProfielBase.GetPropertyValue(PropertyName);

参考文献:http://weblogs.asp.net/anasghanem/archive/2008/04/12/the-differences-in-profile-between-web-application-projects-wap-and-website.aspx

由于有人告诉我这是不可能的,我决定使用动态为自己做这件事。我想这最终只是句法上的糖。

从此开始下降启用Profile.PostalCode = "codeofpost";

/// <summary>
/// Provides a dynamic Profile.
/// </summary>
public abstract class ControllerBase : Controller
{
    private readonly Lazy<DynamicProfile> _dProfile;
    protected ControllerBase()
    {
        _dProfile = new Lazy<DynamicProfile>(() => new DynamicProfile(base.Profile));
    }
    private sealed class DynamicProfile : DynamicObject
    {
        private readonly ProfileBase _profile;
        public DynamicProfile(ProfileBase profile)
        {
            _profile = profile;
        }
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = _profile.GetPropertyValue(binder.Name);
            return true;
        }
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            _profile.SetPropertyValue(binder.Name, value);
            _profile.Save();
            return true;
        }
    }
    /// <summary>
    /// New dynamic profile, can now access the properties as though they are on the Profile,
    /// e.g. Profile.PostCode
    /// </summary>
    protected new dynamic Profile
    {
        get { return _dProfile.Value; }
    }
    /// <summary>
    /// Provides access to the original profile object.
    /// </summary>
    protected ProfileBase ProfileBase
    {
        get { return base.Profile; }
    }
}