【问题标题】:How to Bind ViewModel's object with the controller [duplicate]如何将 ViewModel 的对象与控制器绑定 [重复]
【发布时间】:2016-12-21 13:24:38
【问题描述】:

在我的 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 是我为其创建控制器和视图的模型。我还创建了索引、详细信息、删除和创建视图。索引、详细信息和删除视图工作正常,但创建控制器模型绑定似乎不起作用。作为控制器 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>

【问题讨论】:

  • 您发布的视图在哪里
  • @AhmedRagheb 刚刚添加了它.. 请查看更新后的问题
  • 您应该在 Html.BeginForm 中明确定义模型参数,如下所示:@using (Html.BeginForm("Create", "Project", FormMethod.Post, new { project = Model }))
  • 骗子解释了这个问题,但你在这里做的是糟糕的做法。视图模型不包含属于数据模型的属性。它包含您要在视图中显示/编辑的Project 的每个属性,以及每个下拉列表的IEnumerable&lt;SelectListItem&gt; 属性。请参阅What is ViewModel in MVC?。并查看特定属性([Display] 等不属于您的数据模型 - 它们进入视图模型)。
  • 而且您的下拉列表甚至不能正确地 2 向绑定到任何东西,并且不会为您提供客户端验证(请参阅 this answer 了解如何生成您的下拉列表)

标签: c# asp.net-mvc asp.net-mvc-5 viewmodel


【解决方案1】:

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

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

return View(ProjectViewModel);

【讨论】:

    【解决方案2】:

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

    public ActionResult Create(ProjectViewModel model)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      相关资源
      最近更新 更多