asp.net mvc 3 dataanotation вне полей базы данных в модели не проверяется - PullRequest
0 голосов
/ 20 марта 2011

Как мне сделать так, чтобы у меня было 5 полей в таблице базы данных.

  1. Я создал модель для проверки с примечаниями к данным и создал поле сравнения пароля, а также атрибут сравненияpassword.(теперь моя модель имеет 6 полей, включая одно внешнее поле для сравнения паролей и 5 полей базы данных)

  2. Я создал представление с этой моделью. (Пользователь)

  3. Теперь я также создал контроллер, но здесь возникает проблема: при вызове этого ActionMethod компилятор жалуется на внешнее поле и сообщает, что не может найти какой-либо метод расширения.Как я могу создать метод расширения или устранить эту ошибку?

    [HttpPost]
    public ActionResult Create(User Users)
    {
    
    }
    

Это ошибка, которую я получаю:

CS1061: 'MvcApplication1.Models.User' делаетне содержит определения для «ComparePassword» и не найден метод расширения «ComparePassword», принимающий первый аргумент типа «MvcApplication1.Models.User» (отсутствует директива using или ссылка на сборку?)

Моя модель:

[MetadataType(typeof(UserModel))]
public partial class User { }  
public class UserModel
{
    [Display(Name = "User Name")]        
    [Remote("Username", "User", ErrorMessage = "User Name already exists")]
    [Required(ErrorMessage = "User Name is required")]
    public string vcr_UserName { get; set; }

    [RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Must be a valid Email Address")]
    [Remote("EmailAddress", "User", ErrorMessage = "Email Address already exists")]
    [Required(ErrorMessage = "Email is required")]
    [Display(Name = "Email Address")]
    public string vcr_EmailAddress { get; set; }

    [Display(Name = "Password")]
    [RegularExpression(@"^.{3,16}$", ErrorMessage = "The Password length must be between 3 and 16 characters ")]
    [Required(ErrorMessage = "Password is required")]
    public string vcr_Password { get; set; }

    [Display(Name = "Compare Password")]
    [Compare("vcr_Password", ErrorMessage = "Passwords do not match")]
    public string ComparePassword { get; set; }


    [Required(ErrorMessage = "Country is required")]
    [Display(Name = "Country")]
    public string vcr_Country { get; set; }

    [Required(ErrorMessage = "Website is required")]
    [Display(Name = "WebSite")]        
    public string vcr_Website { get; set; }

    [Display(Name = "Expertise")]
    [Required(ErrorMessage = "Expertise is required")]
    public string vcr_Expertise { get; set; }

    public int int_GroupId { get; set; }
    public Boolean bit_Active { get; set; }
}

Мой контроллер

  public ActionResult Create()
    {
        return View();
    }
    [HttpPost]
    public ActionResult Create(User Users)
    {
        try
        {

            UserRepository UserRep = new UserRepository();
            if (ModelState.IsValid)
            {
                Users.int_GroupId = 2;
                Users.dtm_CreatedDate = DateTime.Now;
                Users.bit_Active = true;
                UserRep.Add(Users);
                UserRep.Save();
            }
            return View();
        }
        catch { return View(); }
    }

Вид

@model MvcApplication1.Models.User
   {
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";

}

Индекс

@using (Html.BeginForm()) {



  @Html.ValidationSummary(true)
<fieldset>
    <legend>Users</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.vcr_UserName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.vcr_UserName)
        @Html.ValidationMessageFor(model => model.vcr_UserName)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.vcr_Password)
    </div>
    <div class="editor-field">
        @Html.PasswordFor(model => model.vcr_Password)
        @Html.ValidationMessageFor(model => model.vcr_Password)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.ComparePassword)
    </div>
    <div class="editor-field">
        @Html.PasswordFor(model => model.ComparePassword)
        @Html.ValidationMessageFor(model => model.ComparePassword)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.vcr_EmailAddress)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.vcr_EmailAddress)
        @Html.ValidationMessageFor(model => model.vcr_EmailAddress)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>

    </fieldset>

}

Хорошо, когда я нажимаю кнопку "Создать", я получаю вышеуказанную ошибку

1 Ответ

3 голосов
/ 20 марта 2011

Что вы подразумеваете под «внешним полем»?

Одна вещь, которая уже приходит на ум, это:

Аннотации данных для поведения представления не должны размещаться в классе модели.Вы должны отделить вашу модель, обращенную к базе данных, от модели представления, обращенной к виду.Об этом написано множество статей.

Если вы создаете модель представления, вы можете добавить туда 6-е поле, добавить аннотации данных, выполнить валидацию и т. Д.

Вы можете использоватьтакой инструмент, как AutoMapper или ValueInjecter , чтобы выполнить отображение от модели к модели представления и наоборот, чтобы вам не пришлось писать слишком много кода.

Если у вас возникнут дополнительные вопросы,свободно спрашивать ...

...