【问题标题】:ViewModel validation object issue with L2SQL generated model classL2SQL 生成的模型类的 ViewModel 验证对象问题
【发布时间】:2010-08-25 16:15:28
【问题描述】:

我在实现 ViewModel 类时遇到问题,该类充当 L2SQL 生成的名为 "User" 的模型类的包装类。简而言之,当我必须针对 L2SQL 模型进行验证时,我有两个实例。一种是用户第一次注册,另一种是用户登录并仅编辑其部分帐户数据。

最初的“问题”是在尝试从仅显示少数几个(例如名字、姓氏、电子邮件)的视图中针对原始 L2SQL 模型仅编辑和验证一些帐户详细信息时,运行验证时,缺少的(例如密码)会突然出现。密码设置将有自己的视图。

我在 StackOverflow 上被告知,添加一个包装 ViewModel 类将是最好的解决方案。所以我做到了,实现如下:

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 的下面一行:

'public string FirstName { get { return UserAccount.FirstName; } 设置 { UserAccount.FirstName = 值; } }'

我哪里出错了,或者其他人可以告诉我更好的推荐方法,因为我是新手。请帮忙!

【问题讨论】:

    标签: asp.net-mvc linq-to-sql validation viewmodel


    【解决方案1】:

    改变你的观点:

    <%@ 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>" %>
    

    【讨论】:

    • 如果我这样做,我会收到此错误:“传入字典的模型项的类型为'Digitalent.Models.User',但此字典需要'Digitalent.Models 类型的模型项。帐户编辑'。”我需要首先使用“Digitalent.Models.User”在 GET View 实例中填充字段。
    • 我需要更改 GET 视图中的任何内容吗?
    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多