以mvc模式将对象传递给控制器

本文关键字:控制器 对象 mvc 模式 | 更新日期: 2023-09-27 17:59:52

我正在学习MVC,这是一种完全不同的思考方式,我以一个简单的登录表单为例,但有一件事让我感到困惑,那就是我如何将提交按钮绑定到Action并传递对象。让我给你举个例子。

这是型号

public class ExternalUser
    {
        [Display(Name = "User Name")]
        [MaxLength(50)]
        public string UserName { get; set; }
        [Display(Name = "Password")]
        public string Password { get; set; }
        [Display(Name = "Remember Me")]
        public bool RememberMe { get; set; }
        public bool IsValid()
        {
            return true;
        }
    }

这是查看

@model ExternalUser
@{
    ViewBag.Title = "Login";    
}
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true, "Login failed. Check your login details.");
    <div>
        <fieldset>
            <legend>Login</legend>
            <div class="editor-label">
                @Html.LabelFor(u => u.UserName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(u => u.UserName)
                @Html.ValidationMessageFor(u => u.UserName)
            </div>
            <div class="editor-label">
                @Html.LabelFor(u => u.Password)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(u => u.Password)
                @Html.ValidationMessageFor(u => u.Password)
            </div>
            <div class="editor-label">
                @Html.CheckBoxFor(u => u.RememberMe)
                @Html.LabelFor(u => u.RememberMe)
            </div>
            <input type="submit" value="Log In" />
        </fieldset>
    </div>
}

这是控制器

 public class UserController : Controller
    {
        // GET: /User/
        public ActionResult Index()
        {
            return View();
        }
        [HttpGet]
        public ActionResult Login()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Login(ExternalUser user)
        {
            if (ModelState.IsValid)
            {
                if (user.IsValid())
                {
                    FormsAuthentication.SetAuthCookie(user.UserName, user.RememberMe);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ModelState.AddModelError("", "Login data is incorrect!");
                }
            }
            return View(user);
        }
        public ActionResult Logout()
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("Index", "Home");
        }
    }

当我单击"登录"按钮时,它将指向public ActionResult Login()的第一个过载,而不是public ActionResult Login(ExternalUser user)的第二个过载,这正是我所期望的,你能告诉我我缺少了什么,为什么它没有达到正确的方法吗?

感谢

以mvc模式将对象传递给控制器

想不出它不起作用的原因。但是,使用inspect element选项检查浏览器中生成的HTML。如果<form>标记的操作属性值设置为"GET",或者操作属性完全丢失,请尝试将其显式指定为post。

Html.BeginForm("Login", "User", FormMethod.Post)

我意识到我在/Shared/SiteLayout.cshtml中添加了一个额外的<form>标记,因此导致在页面上放置了两个<forms>,在删除共享文件夹中的一个之后,它现在启动了正确的方法!我希望这对将来的某个人有所帮助。