C# 如何在ViewModel中发布对象?

C# 如何在ViewModel中发布对象?,c#,asp.net-mvc-5,asp.net-mvc-viewmodel,C#,Asp.net Mvc 5,Asp.net Mvc Viewmodel,我有一个带有整数Id和对象类型的viewmodel类 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 N

我有一个带有整数Id和对象类型的viewmodel类

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发布对象的建议?

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

在视图上进行提交

<input type="submit" value="Create" class="btn btn-default" />
然后应绑定视图模型。

请尝试以下操作:

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

您没有在Bindinclude中包含MyObject

显示完整视图,这样我们就可以看到您试图发布数据的方式。@BarryO'Kane:我已经更新了视图,可能还想更新BeginForm以确保安全,例如使用Html.BeginFormCreate、ControllerName、FormMethod.post、new{class=AnyClassifieded}{}谢谢。巴里:很有效。是的,顶部有@model MyProject.Models.MyViewModel。为了更好地理解,我有一个问题:我使用的是实体框架,默认情况下是使用BindInclude方法来创建绑定。但在这里,这种方法不起作用。这是因为在EF中没有使用ViewModel吗?不,更多的是因为MyObject是视图模型中的嵌套对象。签名public ActionResult Create[bindclude=MyId,MyObject]MyViewModel虚拟机也应该可以工作。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MyId,MyObject, MyObject.Number, MyObject.Name")]MyViewModel vm)
{
    if (!ModelState.IsValid)
    {
        return View();
    }
}