我有一个控制器将一个包含列表和对象客户端的视图模型发送到视图。 视图将在网格中显示列表但隐藏对象客户端。 以下是观点:
@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();
}
但是从视图发送到控制器的视图模型为null。知道如何正确地将视图模型的隐藏部分传递给控制器吗?
答案 0 :(得分:2)
如果要将整个对象作为隐藏对象传递,则必须为该类的每个属性添加隐藏字段,如下所示:
让我们说模型客户端就是这样的
public class Client
{
public string Id { get; set; }
public string SomeAttribute { get; set; }
\\ ......
}
为了将您的值传递给您的操作,您应该将每个属性添加到您的表单中作为隐藏字段,如此
@Html.HiddenFor(m => m.client.Id, Model.client.Id)
@Html.HiddenFor(m => m.client.Someattribute, Model.client.Someattribute)
另一种方法是将模型更改为:
public class MatchesClientViewModel
{
public List<ClientMatch> ClientMatches { get; set; }
public string clientId { get; set; }
\\ .....
}
并将您的clientId仅传递给您的视图并返回控制器,如此
@Html.HiddenFor(m => m.clientId., Model.clientId)
或者如果您不想更改ViewModel,只需添加一个隐藏字段,就像您为客户端id的对象所做的那样,并将其作为额外参数传递给控制器
@Html.HiddenFor('clientId', Model.client.Id)
并按照此行动
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SaveClient(MatchesClientViewModel matchesClientViewModel, string clientId)
{
*some actions*
return View();
}