C# 网站MVC对象

C# 网站MVC对象,c#,asp.net,C#,Asp.net,我试图在用户登录后创建一个成员页面。我的登录功能工作正常,但我无法接收视图的成员信息。在视图上使用断点时,我接收的模型对象为null。MemberInfo方法返回ActionResult对象,您不使用该对象 试试这个代码 [HttpPost] public ActionResult Index(Models.customer cs ) { if(isValid(cs.email, cs.password)) { Session["user

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

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);
}

下面是我创建的一个要点,它作为一个例子,说明在MVC中成功进行身份验证之后,您可能会做什么

它在必要时利用默认的模型绑定器,在不需要时则不利用

用户登录后,如果将其信息存储在会话变量中,则无需将参数传递给成员操作,只需从会话中加载即可

传统上,控制器中的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

行动后有3种可能的行动方案:

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

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

  • 用户输入无效(输入错误、正则表达式失败等)

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

  • 用户输入有效,但找不到信息

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

  • 基本控制器提供的
    重定向路由
    功能将在设置属性值后将用户带到适当的位置

    一旦进入
    MemberController
    ,就不需要有请求参数,因为用户没有执行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);
            }
    
        }
    }
    

    希望这是有意义的,并且可以消除任何困惑。

    您的设置似乎不太正确。您的
    模型。客户
    模型将自动绑定到HTTP请求。如果您在登录时使用该模型(您说该模型正在工作),那么它取决于名为
    电子邮件
    密码
    的表单输入字段。您的成员页面很可能没有这些字段,因此模型绑定器无法构建您的模型。我将尝试添加一个答案来说明这一点它不会传递适当的查询字符串,以便
    MemberInfo(Models.customer em)
    上的模型绑定器能够创建模型,因此它将为空。先前的呼叫
    MemberInfo(c)
    您几乎只是调用一个方法并丢弃该值则它不会重定向到另一个页面,即它不会更改URL,它只会执行操作方法并返回相关视图。
    返回重定向到操作(“SomeAction”)
    将返回301重定向到浏览器,并将其重定向到“SomeAction”,因此浏览器URL将更改。您的意思是在成功登录后尝试重定向到MemberInfo视图吗?操作结果不应返回null。。。曾经您将如何告知登录失败?在索引正文中返回MemberInfo的操作结果无法解决此问题。它保留在登录页面上,而不是重定向MemberInfo方法的视图@迪马恐怖2。检查模型的名称空间。(我也有过相同类名的案例)3。查看页面模型为null,但未引发NullReferenceException?