网站MVC对象
本文关键字:对象 MVC 网站 | 更新日期: 2023-09-27 18:11:51
我正在尝试创建一个成员页面,一旦用户已经登录。我的登录功能工作正常,但我无法接收成员信息到视图。当在视图上使用断点时,我接收模型对象为null。
这是我创建的一个Gist,作为在MVC中成功验证后传统上可能做的事情的示例。
- https://gist.github.com/xDaevax/76aec2867494c0b1d0d8
它在必要时使用默认的模型绑定器,而在不需要时则不使用。
用户登录后,如果要将其信息存储在会话变量中,则不需要向成员操作传递参数,只需从会话中加载即可。
传统上,控制器中的MVC动作应该很简单,没有太多的业务逻辑(它们应该有一个存储库或服务层),而且通常不应该将其他动作方法作为函数调用(它们不是函数,它们是动作)。
让我指出代码的一些相关部分:
using System.Web.Mvc;
using AuthDemo.Models;
using AuthDemo.ViewModels;
namespace AuthDemo.Controllers {
public class LoginController : Controller {
[HttpGet]
public ActionResult Index() {
LoginViewModel viewModel = new LoginViewModel();
return View("Index", viewModel);
}
[HttpPost]
public ActionResult Logon(LoginRequest loginRequest) {
// The default model binder has already performed basic validation against the request, so we check against that
ActionResult result = null;
if (ModelState.IsValid) {
// Continue with login
// Perform some back-end user validation
bool isValidLogin = false;
// var isValidUser = this.MembershipRepository.ValidateUser(loginRequest);
// TODO: perform operations based on the boolean. For now, we pretend it's true
isValidLogin = true;
if (isValidLogin) {
Session["user"] = new UserModel() {
FirstName = "Clara",
LastName = "Oswald",
Email = "oswin@thetardis.com",
Id = 5
};
FormsAuthentication.SetAuthCookie(Session["user"].Email, false);
result = RedirectToRoute("MemberHome"); // Landing page for authenticated users.
} else {
// The user wasn't found in the repository
LoginViewModel viewModel = new LoginViewModel();
viewModel.LogOnRequest = loginRequest;
viewModel.LogOnResponse.Successful = false;
viewModel.Messages.Add("Could not find the user specified.");
viewModel.LogOnRequest.Attempts += 1;
result = View("Index", viewModel);
}
} else {
// Login failed
LoginViewModel viewModel = new LoginViewModel(); // Build a new instance of the view model so we can show validation errors
viewModel.LogOnRequest = loginRequest;
viewModel.LogOnResponse.Successful = false;
viewModel.LogOnRequest.Attempts += 1;
viewModel.Messages.Add("Invalid login");
result = View("Index", viewModel);
}
return result;
}
}
}
在上面的登录控制器中,我有两个操作,一个用于登录的初始Get请求,另一个用于POST。
post action有3个可能的action course:
用户输入有效,我们找到了用户(快乐路径)
在本例中,我们从数据库加载用户信息,分配会话值,并设置身份验证令牌。完成后,我们发出一个Redirect响应并从控制器返回。
用户输入无效(输入错误,正则表达式失败等)
在本例中,我们检查ModelState是否存在问题,并向视图返回一个强类型ViewModel,该视图包含原始请求(持久化表单字段值)以及任何告诉用户期望的自定义消息。
用户输入有效,但没有找到相关信息。
在这种情况下,它与无效输入的情况大致相同,但我们需要以不同的方式向用户指示这一点,以便应用不同的消息。
基本控制器提供的RedirectToRoute
函数将在设置完属性值后将用户带到相应的位置。
在MemberController
中,不需要有request参数,因为用户没有执行post,而是从成功登录重定向。在这种情况下,我们只需要加载从登录中保存的数据,然后做其他需要做的事情,如下所示:
using System.Web.Mvc;
using AuthDemo.Models;
namespace AuthDemo.Controllers {
public class MemberController : Controller {
//
// GET: /Member/
[Authorize]
public ActionResult Index() {
UserModel user = (UserModel)this.Session["user"];
return View("Index", user);
}
}
}
MemberInfo方法返回未使用的ActionResult对象。
试试这个代码
[HttpPost]
public ActionResult Index(Models.customer cs )
{
if(isValid(cs.email, cs.password))
{
Session["user"] = cs.email;
FormsAuthentication.SetAuthCookie(cs.email, false);
customer c = customerEntity.customers.Single(e => e.email == cs.email);
return MemberInfo(c);
}
ModelState.AddModelError(string.Empty, "Authentication Failed");
return View(cs);
}