Member 11232188 Ответов: 2

подтвердите пароль в mvc


Я получил эту ошибку:
Исключение типа 'System.Данных.Лица.Утверждение.DbEntityValidationException ' произошло в EntityFramework.dll, но не был обработан в пользовательском коде

Дополнительная информация: не удалось выполнить проверку для одной или нескольких сущностей. Дополнительные сведения см. В разделе свойство EntityValidationErrors.

===========================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using System.Web.Mvc;

namespace ParkingMvcApp.Models
{
    [MetadataType(typeof(ClientMetaData))]

    public partial class Client
    {
        [DataType("Password")]
        [System.Web.Mvc.Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
    }

    public class ClientMetaData
    {
        [StringLength(10, MinimumLength = 10, ErrorMessage = "Your mobile not corrct")]
        [RegularExpression("([1-9][0-9]*)", ErrorMessage = "You have to enter only numbers 111-111-1111")]
        [Required]
        [Remote("IsUserNameAvailabe","Account",ErrorMessage ="The mobile already in use")]
        public string Mobile { get; set; }

        [Required]
        [DataType("Password")]
        public string Password { get; set; }

        [Required]
        [DisplayName("First Name")]

        public string FirstName { get; set; }

        [DisplayName("Created Date")]
        public Nullable<System.DateTime> CreatedDate { get; set; }


    }
}


=====================================================

[HttpPost]
Регистрация общественная ActionResult(строка Мобайл, строке пароль строке Имя, инт инвалидности)
{
ParkingContext db = новый ParkingContext();

ParkingMvcApp.Модели.Клиент клиент = новые модели.Клиент();
клиент.Мобильного = Мобильного;
клиент.Роль = " C";
клиент.Пароль = Пароль;
клиент.Имя = "Имя";
клиент.CreatedDate = DateTime. Now;
клиент.TyepOfClientID = Инвалидность;

//Чтобы проверить, если пользователь уже regitser
если (дБ.Клиентами.Любой(м =&ГТ; м. Мобильный == Мобильный))
{
ModelState.AddModelError ("мобильный", " мобильный уже используется");
}

if (ModelState.Функция IsValid)
{
дБ.Клиентами.Добавить (клиент);
db. SaveChanges (); <-----------------------------------ошибка
return RedirectToAction("Login", " Account");
}

возвращение смотреть(); ;

}

Примечание: Если я удалю сравнение из кода , программа будет работать так, как я ожидал

2 Ответов

Рейтинг:
17

Ehsan Sajjad

Ваш подход здесь ошибочен. Не меняйте свою модель данных /модель домена для View, вы должны создать ViewModel здесь и сопоставить их с DataModel, в View привязать его к ViewModel и для операций с БД использовать вашу DataModel.

Вы не должны использовать модель домена/ данных, которая сопоставлена с таблицей базы данных в представлении, вы должны использовать ViewModel в соответствии с требованиями в вашем представлении и appply Compare, обязательные атрибуты и т. д. В ViewModel, а не в модели домена. Надеюсь, это поможет.


public class ClientVM
    {
        [StringLength(10, MinimumLength = 10, ErrorMessage = "Your mobile not corrct")]
        [RegularExpression("([1-9][0-9]*)", ErrorMessage = "You have to enter only numbers 111-111-1111")]
        [Required]
        [Remote("IsUserNameAvailabe","Account",ErrorMessage ="The mobile already in use")]
        public string Mobile { get; set; }
 
        [Required]
        [DataType("Password")]
        public string Password { get; set; }

        [DataType("Password")]
        [System.Web.Mvc.Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
 
        [Required]
        [DisplayName("First Name")]
 
        public string FirstName { get; set; }
 
        [DisplayName("Created Date")]
        public Nullable<system.datetime> CreatedDate { get; set; }
        
    }
</system.datetime>



и Ваша модель должна быть в соответствии с таблицей в вашей базе данных:

public class Client
    {
              
        public string Mobile { get; set; }

        public string Password { get; set; }

        public string FirstName { get; set; }

        public Nullable<System.DateTime> CreatedDate { get; set; }

    }




и ваша модель данных останется такой же, как и в соответствии с отображением таблицы. Для сопоставления ViewModel и Model вы можете увидеть эта статья


Member 11232188

это моя модель

//------------------------------------------------------------------------------
// & lt;автоматически сгенерированный>
// Этот код был сгенерирован из шаблона.
//
// Ручные изменения этого файла могут привести к неожиданному поведению вашего приложения.
// Ручные изменения в этом файле будут перезаписаны, если код будет восстановлен.
//
//------------------------------------------------------------------------------

пространство имен ParkingMvcApp. Models
{
использование системы;
использование системы.Коллекции.Общий;

общественный разделяемого класса клиента
{
[Система.Диагностика.Кодовый анализ.SuppressMessage ("Microsoft.Использование", " CA2214:DoNotCallOverridableMethodsInConstructors")]
клиента()
{
этот.Автомобили = новый поиска HashSet И Л;автомобилей>();
}

public string Mobile { get; set; }
роль общественных строки { получить; набор; }
открытый строковый пароль { get; set; }
общественного строка имя { получить; набор; }
общественного строка имя { получить; набор; }
public string Gender { get; set; }
общественного значения null&ЛТ;система.датавремя&ГТ; дата рождения { получить; набор; }
публичная строка Email { get; set; }
общественного строка адреса { получить; набор; }
общественного значения null&ЛТ;система.датавремя&ГТ; CreatedDate { получить; набор; }
общественного значения null&ЛТ;система.датавремя&ГТ; LastLogin { получить; набор; }
общественного строка вопрос { получить; набор; }
public string Answer { get; set; }
public Nullable< int> TyepOfClientID { get; set; }

[Система.Диагностика.Кодовый анализ.SuppressMessage ("Microsoft.Использование", " CA2227:Collectionpropertieshouldbereadonly")]
public virtual ICollection< car & gt; Cars { get; set; }
public virtual TypesofClient tblTypesofClient { get; set; }
}
}

Member 11232188

Я не знаю, что я должен изменить

Ehsan Sajjad

Вы должны создать новый класс со свойствами, которые вам нужно использовать в представлении, которое называется ViewModel, и когда оно будет размещено в карте действий, его свойства будут переданы вашему клиентскому классу geenrated model перед выполнением операций с БД, так что ваша модель базы данных и модель представления будут отличаться.

Member 11232188

Мой вопрос таков:
Когда я удаляю сравнение из своего кода программа работает так как я ожидаю

Member 11232188

Спасибо

Ehsan Sajjad

ответа на него, вы не должны использовать модель предметной области/ данных, который сопоставляется с таблицей базы данных в режиме, вы должны использовать модель представления согласно требованиям, на ваш взгляд, и appply сравниваем обязательные атрибуты и т. д. на видимую модель, не модель предметной области. Надеюсь, это поможет.

Рейтинг:
1

ahmedelbasiony

Добавьте эту строку в свой вид
@формат HTML.HiddenFor(model = & gt; model.Подтвердить пароль)

и это к вашему методу действия в контроллере

[HttpPost]
        public ActionResult Create(User user)
        {
            // TODO: Add insert logic here
            if (ModelState.IsValid)
            {
                user.ConfirmPassword = user.Password;
}
}