1

我正在尝试初始化属性类,但由于某种原因,我正在努力解决结果。

我在 Visual Studio 2012 中创建了 MVC4“基本”项目模板。我在我的项目中创建了名称为 Filters 的文件夹并创建了类 InitializeSimpleMembership.cs。我有 Home 控制器和相关视图,最后我在 home 控制器类中调用 [InitializeSimpleMembership] 但没有结果。应用程序未生成所需的表。(注意:我之前创建过数据库)

我正在尝试用最少的代码初始化 SimpleMemberShip,以便我可以理解并使其随着它的增长而变得复杂。

在过滤器文件夹中

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Threading;
using System.Web.Mvc;
using WebMatrix.WebData;
using SimpleLogin_System_04.Models;

namespace SimpleLogin_System_04.Filters
 {
  public class InitializeSimpleMembership : ActionFilterAttribute
  {
    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        { 
          try
            {                  
              WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
            catch (Exception ex)
            {
               throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, ex);
            }
        }
    }
  }
}

家庭控制器

namespace SimpleLogin_System_04.Controllers
 {
[InitializeSimpleMembership]
public class HomeController : Controller
{    
    public ActionResult Index()
    {
        return View();
    }
}
}

网络配置;连接字符串

<connectionStrings>
  <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=dd3;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\dd3.mdf" />
</connectionStrings>
4

2 回答 2

1

我没有看到任何调用SimpleMembershipInitializer构造函数的东西,它具有初始化数据库的代码。为什么不将该代码放在InitializeSimpleMembership的默认构造函数中。

我建议只将初始化放在 Global.asax Application_Start方法中,而不是使用过滤器类,因为您将它放在HomeController中。MVC 4 Internet 模板在AccountController上使用过滤器的原因是仅在使用安全性时才用于延迟加载安全性。如果您总是希望它初始化,只需使用 Global.asax。本文对SimpleMembership的初始化有很好的描述。

于 2013-07-22T13:06:12.270 回答
0

是的,我意识到我没有调用构造函数。我想继续使用过滤器命名空间,因为最终我会添加延迟加载。只是暂时尝试将事物分解成最小的部分,以便我可以了解安全行为。

再加上我也错过了一些实现......但现在让系统运行了!在这里,我有解决问题的方法。

过滤器文件夹

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Threading;
using System.Web.Mvc;
using WebMatrix.WebData;
using SimpleLogin_System_04.Models;

namespace SimpleLogin_System_04.Filters
{
public class InitializeSimpleMembership : ActionFilterAttribute
{
    public InitializeSimpleMembership()
    {
        try
        {
            if (!WebSecurity.Initialized)
            {
                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
        }
    }
}

}

网络配置

<connectionStrings>
  <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=DB4;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\DB4.mdf" />
</connectionStrings>

<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
  </providers>
</membership>

<roleManager enabled="true">
  <providers>
    <add name="DefaultRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
  </providers>
</roleManager>

帐户控制器类

[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller

和我在代码运行之前创建的数据库,因为如果找不到,我不希望系统创建一个。虽然它是在简单的会员数据库连接初始化阶段创建表..

于 2013-07-22T14:52:49.503 回答