我正在尝试以Nerd Dinner MVC应用程序为基础来学习开发MVC应用程序的正确方法。
我已经创建了接口和存储库作为参考代码建议并使用Entity Framework进行数据访问。
如果我想在用户注册表[dbo]。[用户]时插入数据,我没有用户控制器,我该怎么做?
AccountController.cs
[HandleError]
public class AccountController : BaseController
{
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);
if (createStatus == MembershipCreateStatus.Success)
{
// TODO: Enter record into [Users] get reference to [Aspnet_UserId]
// How do I do this??
//FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
}
如果我创建一个UsersController来显示基于Users表的视图,那么在用户注册时如何添加新记录呢?
当新用户注册添加[Aspnet_UserId] Guid时,我希望填充一个单独的表[Users]。
答案 0 :(得分:1)
您不需要为数据库中的每个表都有一个控制器。在上面的代码中,MembershipService是实际创建记录的代码(通过用户的存储库)。
控制器应代表您网站提供的各种区域和功能组。虽然在许多情况下,您可能拥有一个控制器,其中包含与特定实体相关的视图,创建和更新操作,这些操作与特定数据库表相关,但并非总是如此。
如果因为要查看用户列表或特定用户配置文件而拥有UsersController是有意义的,那很好,但创建用户的表单不一定是该控制器的一部分。让它成为会员,管理员,帐户或注册控制器的一部分也是可以的。
<强>更新强> 我将尝试为您提供我希望代码看起来的示例代码。但是你可能还有别的想法,这也很好,没有真正的单一方法可以做这些事情。
在上面的代码中,我不确定您的MembershipService类正在做什么。它上面有一个静态方法可以执行与User Creation相关的操作。我希望您的MembershipService类应该调用您的UserRepository来实际进行用户创建。但是你可能不会想要一个静态类/方法。
public class MembershipCreationResult
{
public User Member { get; private set; }
public MembershipCreateStatus MembershipCreateStatus { get; private set; }
public MembershipCreationResult(User user, MembershipCreateStatus status)
{
Member = user;
MembershipCreateStatus = status;
}
public bool Success
{
get { return MembershipCreateStatus == MembershipCreateStatus.Success; }
}
}
public class MembershipService
{
public IUserRepository { get; private set; }
public MembershipService(IUserRepository userRepository)
{
UserRepository = userRepository;
}
public MembershipCreateResult CreateUser(string name, string password, string email)
{
User member = UserRepository.Create(name, password, email);
bool status = member != null ? MembershipCreateStatus.Success : MembershipCreateStatus.Failure;
return new MembershipCreationResult(status, member)
}
}
我没有仔细查看NerdDinner示例,我没有使用ASP.NET成员资格提供程序,但我上面概述的概念应该有效。如果MembershipService的行为与我概述的不同,那么您可以创建一个新服务来包装功能并保留现有的MembershipService。