如何将 ViewModel 的对象与控制器绑定

How to Bind ViewModel's object with the controller

在我的 MVC 应用程序中,我有一个模型 class 如下所示

public class PROJECT
{
    [Display(Name = "Project No.")]
    public string PROJECT_NO { get; set; }

    [Display(Name = "Title")]
    [DataType(DataType.MultilineText)]
    [Required]
    public string TITLE { get; set; }

    [Display(Name = "Description")]
    [DataType(DataType.MultilineText)]
    public string DESCRIPTION { get; set; }

    [Display(Name = "Remarks")]
    public string REMARKS { get; set; }
}

我有一个像这样的 ViewModel

public class ProjectViewModel
{
    public PROJECT Project { get; set; }

    public bool IsSelected { get; set; }

    public COMPANY Companies { get; set; }

    public CLIENT Clients { get; set; }
}

ViewModel 是我为其创建控制器和视图的模型。我还创建了索引、详细信息、删除和创建视图。索引、详细信息和删除视图工作正常,但创建控制器模型绑定似乎不起作用。作为控制器 Create 输入的 ProjectViewModel 对象为空。如何将 ViewModel 作为参数绑定到此对象?

    // POST: /Project/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(ProjectViewModel project)
    {
        if (ModelState.IsValid)
        {
            db.PROJECTs.Add(project.Project);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.CLIENT_ID = new SelectList(db.CLIENTs, "ID", "NAME", project.Project.CLIENT_ID);
        ViewBag.COMPANY_ID = new SelectList(db.COMPANies, "ID", "NAME", project.Project.COMPANY_ID);
        return View(project);
    }

这是创建视图

@model IMCCBluePrints.Models.ProjectViewModel

@{
    ViewBag.Title = "Create";
 }

 <h2>Create</h2>

@using (Html.BeginForm()) 
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>PROJECT</h4>
    <hr />
    @Html.ValidationSummary(true)

    <div class="form-group">
        @Html.LabelFor(model => model.Project.PROJECT_NO, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Project.PROJECT_NO)
            @Html.ValidationMessageFor(model => model.Project.PROJECT_NO)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Project.TITLE, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Project.TITLE)
            @Html.ValidationMessageFor(model => model.Project.TITLE)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Project.DESCRIPTION, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Project.DESCRIPTION)
            @Html.ValidationMessageFor(model => model.Project.DESCRIPTION)
        </div>
    </div>




    <div class="form-group">
        @Html.LabelFor(model => model.Project.REMARKS, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Project.REMARKS)
            @Html.ValidationMessageFor(model => model.Project.REMARKS)
        </div>
    </div>



    <div class="form-group">
        @Html.LabelFor(model => model.Project.COMPANY_ID, "COMPANY_ID", new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("COMPANY_ID", String.Empty)
            @Html.ValidationMessageFor(model => model.Project.COMPANY_ID)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Project.CLIENT_ID, "CLIENT_ID", new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("CLIENT_ID", String.Empty)
            @Html.ValidationMessageFor(model => model.Project.CLIENT_ID)
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

在您的 GET 操作中实例化您的项目 class 并尝试:

...
ProjectViewModel.project = new PROJECT();
...

return View(ProjectViewModel);

表单提交项目与项目类型冲突的问题,因为它是复杂类型,只需将其重命名为模型即可

public ActionResult Create(ProjectViewModel model)

试试这个,它会起作用,我自己试过。