如何将视图模型的对象与控制器绑定



在我的MVC应用程序中,我有一个像下面的模型类

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是我正在创建控制器和视图的一个。我也创建了索引,详细信息,删除并创建视图。索引,详细信息和删除视图只是效果很好,但创建控制器模型绑定似乎无法正常工作。作为控制器创建的输入的projectViewModel对象为null。如何将视图模型作为参数绑定到此对象?

    // 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>

在您的获取行动中实例化您的项目类,然后尝试:

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

当形式提交项目冲突与类型项目一样复杂时,只需将其重命名为模型,例如

public ActionResult Create(ProjectViewModel model)

尝试一下,它将起作用,我已经尝试了。

最新更新