【问题标题】:Instantiating ViewModel for a View为视图实例化 ViewModel
【发布时间】:2013-07-15 15:38:29
【问题描述】:

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

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

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

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

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

Project View Model Base 是项目的基础 viewModel,所有相关的操作都由此派生,因此我不需要一次又一次地编写属性名称。

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

现在我为 “创建新项目” 创建了一个表单,它使用 ProjectCreateViewModel。然而,在表单发布操作中,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                             
}

项目控制器

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

      // OTHER STUFF

      return View("CreateNewProject", projectCreateViewModel);
}

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

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

更新:问题根源无法使用隐藏字段将复杂对象绑定到视图模型。

任何建议或想法表示赞赏。

【问题讨论】:

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


    【解决方案1】:

    您不需要HiddenForCourseVM。 MVC 会自动为你创建类,因为你正在绑定 CourseVM.CourseNumberRoot

    目前,您正尝试从 MVC 无法执行的隐藏输入中绑定复杂对象 CourseVM,因此它返回 null。

    【讨论】:

    • 而且效果很好。我认为将整个“CourseVM”隐藏起来会创建新的 courseVM 对象。感谢您提供有关“复杂对象无法绑定到隐藏输入字段”的信息
    猜你喜欢
    • 2020-04-10
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2020-05-19
    相关资源
    最近更新 更多