【发布时间】:2018-04-30 13:20:34
【问题描述】:
我有一个控制器将由列表和对象客户端组成的视图模型发送到视图。 该视图将在网格中显示列表,但隐藏对象客户端。 这是视图:
@model .Business.BusinessModels.MatchesClientViewModel
@{
ViewBag.Title = "SaveClient";
}
<h2>SaveClient</h2>
<h3>
The info captured matches @Model.ClientMatches.Count()
</h3>
@using (Html.BeginForm("SaveClient", "Client", FormMethod.Post))
{
@Html.AntiForgeryToken()
WebGrid grid = new WebGrid(Model.ClientMatches);
@grid.GetHtml(columns: new[]
{
grid.Column("Name"),
grid.Column("Surname"),
grid.Column("Email"),
})
@Html.Hidden("client", Model.client)
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
}
我的提交按钮点击的操作是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SaveClient(MatchesClientViewModel matchesClientViewModel)
{
*some actions*
return View();
}
但是从视图发送到控制器的视图模型是空的。知道如何正确地将视图模型的隐藏部分传递给控制器吗?
【问题讨论】:
-
Model.Client 是一个对象?还是只是一个 id?
-
@AnastasiosSelmanis : 它是一个对象
-
那么我害怕你必须像这样传递对象的每个字段:@Html.HiddenFor(m => m.client.Id, Model.client.Id), @Html。 HiddenFor(m => m.client.someattribute., Model.client.someattribute) 等。它会映射到您的表单提交上。一般来说,最好只使用 client.id,因为这可能是您在后端想要的,或者如果您想要对象只需从后端再次获取客户端对象。
-
那么我是否也必须更改我的操作 SaveClient 参数?我没有使用 MatchesClientViewModel 作为参数,而是使用了一些属性类型?
-
@tabby,不,模型绑定器应该能够找出这些字段属于模型的
client字段,并根据属性值为您创建它。但是,仅当字段是强类型时才适用。只是object很可能不会工作
标签: c# asp.net-mvc