为视图实例化ViewModel

时间:2013-07-15 15:38:29

标签: asp.net-mvc-4 view viewmodel

更新绑定视图模型的隐藏字段。

让我试着解释一下我的情况。我可能完全错了,但这是我认为给我带来问题的原因。

我有一个ViewModel
项目创建视图模型

[Bind(Exclude="List")]
    public class ProjectCreateViewModel : ProjectViewModelBase
    {
        public CourseViewModelBase CourseVM { get; set; }

        public ProjectCreateViewModel()
            : base()
        {
            this.CourseVM = new CourseViewModelBase();
        }    
    }

项目视图模型库是项目的基本viewModel,所有相关的操作都是从此派生的,因此我不需要反复编写属性名称。

创建视图模型库类似于ProjectViewModelBase(由ProjectController处理或使用),但用于课程(由CourseController处理)。

现在我已经为“创建新项目”创建了一个表单,该表单使用 ProjectCreateViewModel 。在Form post action中, CourseVM 始终为 null

创建新项目.cshtml

@model LMSPriorTool.ViewModels.ProjectCreateViewModel

@* --- labels and other stuff -- *@
@using (Html.BeginForm("CreateNewProject", "Project", 
                       FormMethod.Post, new { @class = "form-horizontal", 
                       name = "createNewProjectForm" }))
{
     <!-- Hidden Fields -->
     @Html.HiddenFor( x => x.ProjectId)
     @Html.HiddenFor( x => x.CourseVM)   // CourseVM is null in post action
     @Html.TextBoxFor(x => x.CourseVM.CourseNumberRoot)    // This is displayed properly                             
}

ProjectController

[HttpGet]
public ActionResult CreateNewProject(CourseViewModelBase courseVM = null)
{
      ProjectCreateViewModel projectCreateViewModel = new ProjectCreateViewModel
      {
           CourseVM = courseVM,
      };

      // OTHER STUFF

      return View("CreateNewProject", projectCreateViewModel);
}

错误 在HTTPPOST操作中,我将CourseVM视为null,尽管我已将其作为隐藏字段提供给表单。

enter image description here

可能的问题 我相信问题是 ProjectCreateViewModel 的构造函数,因为当HTTPPOST操作发生时,视图将尝试创建<的新实例strong> ProjectCreateViewModel 并将CourseVM实例化为null。然后将相同的实例传递给HTTPPOST方法,其中CourseVM显示为null。

UPDATE:ISSUE ROOT CAUSE 无法使用隐藏字段将复杂对象绑定到视图模型。

赞赏任何建议或想法。

1 个答案:

答案 0 :(得分:1)

您不需要HiddenFor CourseVM。 MVC将自动为您创建类,因为您绑定了CourseVM.CourseNumberRoot

目前,您正在尝试绑定CourseVM,这是一个复杂的对象,来自MVC无法执行的隐藏输入,因此它返回null。