创建由MVC3中其他模型的对象组成的视图模型

时间:2012-10-03 16:52:04

标签: asp.net-mvc-3 c#-4.0 viewmodel

我有一个模型和一个可枚举的模型,我将它放在asp.net mvc3中的视图模型中,就像这样。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;


namespace FuelPortal.Models.DBModels
{
    public class UserDBModel
    {

        public int userId { get; set; }

        [Required, Display(Name = "User Name")]
        public string userName { get; set; }

        [Required, Display(Name = "Password")]        
        public string password { get; set; }

        [Required, Display(Name = "First Name")]
        public string firstName { get; set; }

        [Required, Display(Name = "Last Name")]
        public string lastName { get; set; }

        [Required, Display(Name = "Email")]
        public string email { get; set; }

        [Display(Name = "Phone")]
        public string phone { get; set; }

        [Display(Name = "Account Expiration Date(Optional)")]
        public DateTime expireDate { get; set; }

        [Display(Name = "Password Expiration Date")]
        public DateTime passwordExpireDate { get; set; }

        [Display(Name = "Last Date Modified")]
        public DateTime DateModified { get; set; }

    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FuelPortal.Models.DBModels;

namespace FuelPortal.Models.ViewModels
{
    public class UserMaintenanceViewModel
    {

        public UserDBModel user = new UserDBModel();
        public List<UserDBModel> userList = new List<UserDBModel>();
    }
}

现在我强烈键入一个视图以使用视图模型。

@model FuelPortal.Models.ViewModels.UserMaintenanceViewModel  
<div class="frmBG">
        @using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "wrapperData" }))
        {

                <h5>Create New User</h5> 
                <br />
                <table cellpadding="2" cellspacing="10" border="0">
                <tr><td>
                <div class="editor-label">
                    @Html.LabelFor(model => model.user.userName)
                </div></td><td>

                <div class="editor-field">
                    @Html.EditorFor(model => model.user.userName)
                    @Html.ValidationMessageFor(model => model.user.userName)
                </div></td></tr>

                <tr><td>
                <div class="editor-label">
                    @Html.LabelFor(model => model.user.password)
                </div></td><td>
                <div class="editor-field">
                    @Html.PasswordFor(model => model.user.password)
                    @Html.ValidationMessageFor(model => model.user.password)
                </div></td></tr>

                <tr><td>
                <div class="editor-label">
                    @Html.LabelFor(model => model.user.firstName)
                </div></td><td>
                <div class="editor-field">
                    @Html.EditorFor(model => model.user.firstName)
                    @Html.ValidationMessageFor(model => model.user.firstName)
                </div></td></tr>

                <tr><td>
                <div class="editor-label">
                    @Html.LabelFor(model => model.user.lastName)
                </div></td><td>
                <div class="editor-field">
                    @Html.EditorFor(model => model.user.lastName)
                    @Html.ValidationMessageFor(model => model.user.lastName)
                </div></td></tr>

                <tr><td>
                <div class="editor-label">
                    @Html.LabelFor(model => model.user.email)
                </div></td><td>
                <div class="editor-field">
                    @Html.EditorFor(model => model.user.email)
                    @Html.ValidationMessageFor(model => model.user.email)
                </div></td></tr>

                <tr><td>
                <div class="editor-label">
                    @Html.LabelFor(model => model.user.phone)
                </div></td><td>
                <div class="editor-field">
                    @Html.EditorFor(model => model.user.phone)
                    @Html.ValidationMessageFor(model => model.user.phone)
                </div></td></tr>

                <tr><td>
                <div class="editor-label">
                    @Html.LabelFor(model => model.user.expireDate)
                </div></td><td>
                <div class="editor-field">
                    @Html.EditorFor(model => model.user.expireDate)
                    @Html.ValidationMessageFor(model => model.user.expireDate)
                </div></td></tr>

                <tr><td></td><td>
                <p>
                    <input type="submit" value="" class="create" /><input type="button" value="" class="close_tab"/>
                </p></td></tr>
                </table>
        }
    </div>

由于某些原因,在帖子上它不会填充视图模型中的对象。因此,当我创建一个post动作时,(UserMaintenanceViewModel模型)的所有值都为null。像这样......

 [HttpPost]
        public ActionResult CreateUser(UserMaintenanceViewModel model)
        {
            try
            {
                /// TODO: Add insert logic here
                var result = repository.insertNewUser(Session["UserId"].ToString(), model.user.UserName, model.user.Password, model.user.FirstName,
                                                      model.user.LastName, model.user.Email, model.user.Phone, model.user.ExpireDate);
                // If result > 0 user insert successful

此外,如果我切换到通过(FormCollection表单)获取回发,我看到html元素的名称是“user.UserName”而不是预期的“UserName”。我非常感谢任何指导,我觉得我应该能够做到这一点。

非常感谢

1 个答案:

答案 0 :(得分:3)

如果你有一个复杂的视图模型,那么你必须确保在构造函数中创建一个对象的实例。然后,您可以向任何子对象添加信息,因为它现在有一个实例。

public class MyViewModel
{


    public MyViewModel()
    {
        Customer= new CustomerViewModel ();
        Address = new AddressViewModel();
    }

    public int OrderNumber{ get; set; }
    public CustomerViewModel Customer  { get; set; }
    public AddressViewModel Address { get; set; }

}

}