繁体   English   中英

如何将来自视图的对象绑定到数据库中已存在的对象?

[英]how do i bind an object that came from a view to an object that already exists in the database?

我正在尝试制作一个登录页面,但我的modelstate返回为无效,我认为这是因为我收到了一个“不完整”的对象。

这是我的控制器

 public ActionResult Login() 
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Login(User u)
    {
        if (ModelState.IsValid) 
        {
            {
                var v = entities.Users.Where(a => a.UserName.Equals(u.UserName) && a.Password.Equals(u.Password)).FirstOrDefault();
                if (v != null)
                {
                    Session["LoggedUserID"] = v.UserID.ToString();
                    Session["LoggedUserFullname"] = v.FirstName +" "+ v.LastName;
                    return RedirectToAction("AfterLogin");
                }
            }
        }
        return View(u);
    }

这是Login页面本身

 @model Car_Dealership.Views.Shared.User

@{
    ViewBag.Title = "Login";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Login</h2>

@using (Html.BeginForm("Login", "Home", FormMethod.Post))
{

    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    if (@ViewBag.Message != null)
    {
        <div style="border:1px solid red">
            @ViewBag.Message
        </div>
    }
    <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>

            <input type="submit" value="Login" />
        </fieldset>
    </div>
}

@* This below line is for create javascript section *@

@section Scripts{
    @Scripts.Render("~/bundles/jqueryval")
}

这是User

  namespace Car_Dealership.Views.Shared
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public partial class User
    {
        public User()
        {
            this.Orders = new HashSet<Order>();
        }

        [Required]
        public int UserID { get; set; }

        [Required]
        public string FirstName { get; set; }

        [Required]
        public string LastName { get; set; }

        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required(ErrorMessage ="Date Of Birth is Required in YYYY-MM-DD Format")]
        [Display(Name = "Date Of Birth")]
        [RegularExpression(@"/^\d{4}-\d{2}-\d{2}$/")]
        public System.DateTime DateOfBirth { get; set; }

        [Required]
        public string Gender { get; set; }

        [Required(ErrorMessage = "Email is Required")]
        [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                            @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                            @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
                            ErrorMessage = "Email is not valid")]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Required]
        public string Authorize { get; set; }

        public virtual ICollection<Order> Orders { get; set; }
    }

我试图通过执行if(u.username=entities.users.where(a=>a.username)&& the same for password)来使u具有应该与之对应的对象的所有属性,但是没有工作。 不太确定在这里做什么

您的假设是正确的:从客​​户端传递的用户对象不完整,并且缺少必需的属性。

一个解法:

您的登录视图不应接收User模型,而应创建一个LoginViewModel:

public class LoginViewModel
{
   [Required]
   [Display(Name = "User name")]
   public string UserName {get; set;}

   [Required]
   [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
   [DataType(DataType.Password)]
   public string Password {get; set;}
}

您的看法将是:

@model LoginViewModel
@using (Html.BeginForm("Login", "Home", FormMethod.Post))
{

@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
if (@ViewBag.Message != null)
{
    <div style="border:1px solid red">
        @ViewBag.Message
    </div>
}
<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>

        <input type="submit" value="Login" />
    </fieldset>
</div>

}

控制器:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel u)
    {
        if (ModelState.IsValid) 
        {
            {
                var v = entities.Users.Where(a => a.UserName.Equals(u.UserName) && a.Password.Equals(u.Password)).FirstOrDefault();
                if (v != null)
                {
                    Session["LoggedUserID"] = v.UserID.ToString();
                    Session["LoggedUserFullname"] = v.FirstName +" "+ v.LastName;
                    return RedirectToAction("AfterLogin");
                }
            }
        }
        return View(u);
    }

PS存储纯密码确实不是一个好主意。 您应该存储密码哈希。 我还建议您看一下[asp.net身份1,它确实可以使用户管理容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM