网站MVC对象

本文关键字:对象 MVC 网站 | 更新日期: 2023-09-27 18:11:51

我正在尝试创建一个成员页面,一旦用户已经登录。我的登录功能工作正常,但我无法接收成员信息到视图。当在视图上使用断点时,我接收模型对象为null。

网站MVC对象

这是我创建的一个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:

  1. 用户输入有效,我们找到了用户(快乐路径)

    在本例中,我们从数据库加载用户信息,分配会话值,并设置身份验证令牌。完成后,我们发出一个Redirect响应并从控制器返回。

  2. 用户输入无效(输入错误,正则表达式失败等)

    在本例中,我们检查ModelState是否存在问题,并向视图返回一个强类型ViewModel,该视图包含原始请求(持久化表单字段值)以及任何告诉用户期望的自定义消息。

  3. 用户输入有效,但没有找到相关信息。

    在这种情况下,它与无效输入的情况大致相同,但我们需要以不同的方式向用户指示这一点,以便应用不同的消息。

基本控制器提供的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);
}