簡體   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