【问题标题】:How to post objects in ViewModel?如何在 ViewModel 中发布对象?
【发布时间】:2017-06-06 14:24:41
【问题描述】:

我有一个带有整数 ID 和对象类型的视图模型类。

public class MyViewModel
{
    [Required]
    public int MyId { get; set; }

    public MyObject MyObject { get; set; }
}

MyObject 模型是:

public class MyObject 
{
    [Key]
    public int ObjId { get; set; }

    public int Number { get; set; }
    public string Name { get; set; }

}

这个控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MyId, MyObject.Number, MyObject.Name")]MyViewModel vm)
{
    if (!ModelState.IsValid)
    {
        return View();
    }
//do something!
}

观点是:

@model MyProject.Models.MyViewModel

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

    <div class="form-group">
        @Html.LabelFor(model => model.MyId , htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("MyId", null, "Select", htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.MyId, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.MyObject.Number, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.MyObject.Number, new { @class = "form-control", type = "number", min = "1", max = "3", step = "1" })
            @Html.ValidationMessageFor(model => model.MyObject.Number, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.MyObject.Name , htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.MyObject.Name , new { @class = "form-control", type = "number", min = "1", max = "3", step = "1" })
            @Html.ValidationMessageFor(model => model.MyObject.Name , "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" formaction="@Url.Action("Create")" />
        </div>
    </div>
}

当我将数据发布到控制器时,它会识别 MyId 值但不填充 MyObject 参数。任何建议如何使用 ViewModel 发布对象?

【问题讨论】:

  • 显示完整视图,以便我们了解您尝试发布数据的方式。
  • @BarryO'Kane:我已经更新了视图

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


【解决方案1】:

假设您在视图顶部有@model MyViewModel,则无需将其复杂化。

在视图上提交

<input type="submit" value="Create" class="btn btn-default" />

并更改 post 方法的签名

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(MyViewModel vm)
{
    if (!ModelState.IsValid)
    {
        return View();
    }
//do something!
}

然后应该绑定视图模型。

【讨论】:

  • 还可能想要更新 BeginForm 以确保安全,例如使用 (Html.BeginForm("Create", "ControllerName", FormMethod.Post, new { class= "anyClassIfNeeded" })) { }
  • 谢谢巴里:它有效。是的,顶部有@model MyProject.Models.MyViewModel。我有一个问题,为了更好地理解:我正在使用实体框架,默认情况下使用方法“绑定(包含)”来创建绑定。但是这里这种方法行不通。是因为 EF 中没有使用 ViewModel 吗?
  • 不,这更多是因为MyObject 是视图模型中的嵌套对象。签名public ActionResult Create([Bind(Include = "MyId, MyObject")]MyViewModel vm) 也应该可以工作。
【解决方案2】:

试试下面:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MyId,MyObject, MyObject.Number, MyObject.Name")]MyViewModel vm)
{
    if (!ModelState.IsValid)
    {
        return View();
    }
}

Bind(include) 中没有包含 MyObject

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2018-11-20
    • 2019-12-06
    相关资源
    最近更新 更多