Проблема объекта проверки ViewModel с классом модели, сгенерированным L2SQL - PullRequest
0 голосов
/ 25 августа 2010

У меня проблемы с реализацией класса ViewModel, который действует как класс-оболочка для класса Model с именем "Пользователь" , созданного L2SQL. Короче говоря, у меня есть два случая, когда мне нужно проверить модель L2SQL. Один, когда пользователь впервые регистрируется, и второй, когда пользователь входит в систему и редактирует только часть данных своей учетной записи.

Первоначальная «проблема» была при попытке отредактировать и проверить только некоторые данные учетной записи относительно исходной модели L2SQL из представления, в котором отображаются только несколько (например, FirstName, LastName, Email), отсутствующие те (например, пароль) будут вспыхивать при запуске проверки. Настройки пароля будут иметь свой собственный вид.

Мне сообщили здесь, на StackOverflow, что добавление оберточного класса ViewModel было бы лучшим решением. Так я и сделал, реализовал ниже:

Код модели представления:

[Bind]
public class AccountEdit 
{ 
    public User UserAccount { get; set; } 

    [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength = 3, ErrorMessage = "Must be between 3 and 20 characters")]   
    public string FirstName  { get { return UserAccount.FirstName; } set { UserAccount.FirstName = value; } }

    [Required(ErrorMessage = "Last name required"), StringLength(20, MinimumLength = 3, ErrorMessage = "Must be between 3 and 20 characters")]
    public string LastName { get { return UserAccount.LastName; } set { UserAccount.LastName = value; } }

    [Required(ErrorMessage = "Email address required"), RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$", ErrorMessage = "Must be a valid email address")]
    public string Email { get { return UserAccount.Email; } set { UserAccount.Email = value; } }
}

Код контроллера:

//
// GET /User/Account
public ActionResult Account()
{
    string cookieUser = User.Identity.Name;
    User user = userRepository.GetUserByEmail(cookieUser);
    return View(user);
}

// POST /User/Account
[HttpPost]
public ActionResult Account(AccountEdit model)
{                
    if (ModelState.IsValid)
    {
        model.LastUpdated = DateTime.Now; 
        userRepository.Save();
    }
    return View(model);
}

Вид кода:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/User.Master" Inherits="System.Web.Mvc.ViewPage<Digitalent.Models.User>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Account settings
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<% using (Html.BeginForm()) {%>

    <%= Html.ValidationSummary("Oops! Please correct the errors and try again!") %>

        <p>
            <label for="FirstName">First name:</label>
            <%: Html.TextBoxFor(model => model.FirstName, new { @class = "textfield" })%> 
            <%: Html.ValidationMessageFor(model => model.FirstName) %>
        </p>

        <p>
            <label for="LastName">Last name:</label>
            <%: Html.TextBoxFor(model => model.LastName, new { @class = "textfield" })%> 
            <%: Html.ValidationMessageFor(model => model.LastName) %>
        </p>

        <p>
            <label for="Email">Email address:</label>
            <%: Html.TextBoxFor(model => model.Email, new { @class = "textfield" })%> 
            <%: Html.ValidationMessageFor(model => model.Email) %>
        </p>

        <p>
            Email newsletter: <%= Html.CheckBoxFor(model => model.EmailNewsletter) %>
            <label for="EmailNewsletter">Keep me posted with latest Digitalent happenings.</label>
        </p>


        <p>
            <input type="submit" value="Save changes" class="button" />
        </p>

        <p><a href="/talent/password">Change your password settings</a></p>

<% } %>

Но теперь, когда я пытался запустить приложение, я получаю сообщение об ошибке, когда оно запускает проверку:

'Ссылка на объект не установлена ​​на экземпляр объекта.'

В строке ниже в моей ViewModel:

'публичная строка FirstName {get {return UserAccount.FirstName; } set {UserAccount.FirstName = value; }} '

Где я иду не так, или кто-нибудь еще может сказать мне лучший подход, поскольку я новичок. Помогите пожалуйста!

1 Ответ

0 голосов
/ 25 августа 2010

Измените ваш взгляд с:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/User.Master" 
    Inherits="System.Web.Mvc.ViewPage<Digitalent.Models.User>" %>

на:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/User.Master" 
    Inherits="System.Web.Mvc.ViewPage<Digitalent.Models.AccountEdit>" %>
...