这是我的模特:
public string CustomerNumber { get; set; }
public string ShipMethod { get; set; }
public string ContactPerson { get; set; }
public string ShipToName { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3{ get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
这是我观点的一部分:
<table class="table table-condensed">
<thead>
<tr>
<td>Customer Number</td>
<td>Ship Method</td>
<td>Contact Person</td>
<td>Ship to Name</td>
<td>Address 1</td>
<td>Address 2</td>
<td>Address 3</td>
<td>City</td>
<td>State</td>
<td>Zip</td>
</tr>
</thead>
<tbody>
<tr>
<td>@Html.LabelFor(x => x.CustomerNumber, Model.CustomerNumber)</td>
<td>@Html.LabelFor(x => x.ShipMethod, Model.ShipMethod)</td>
<td>@Html.LabelFor(x => x.ContactPerson, Model.ContactPerson)</td>
<td>@Html.LabelFor(x => x.ShipToName, Model.ShipToName)</td>
<td>@Html.LabelFor(x => x.Address1, Model.Address1)</td>
<td>@Html.LabelFor(x => x.Address2, Model.Address2)</td>
<td>@Html.LabelFor(x => x.Address3, Model.Address3)</td>
<td>@Html.LabelFor(x => x.City, Model.City)</td>
<td>@Html.LabelFor(x => x.State, Model.State)</td>
<td>@Html.LabelFor(x => x.ZipCode, Model.ZipCode)</td>
</tr>
</tbody>
</table>
数据在视图中正确显示,但当我的页面上发生帖子时,数据会返回null。我需要将那些LabelFors中的数据发送回我的控制器,所以我不必将它存储在会话中。我认为MVC应该与labelfors自动绑定到你的模型。我做错了什么?
编辑
我想我问这个问题的原因是因为我刚从webforms转移到MVC,而且我在没有viewstate的情况下迷失了。我想如果我的模型中的值不断从视图中发回给我,我就不必将我的模型存储在会话对象中。在我的页面上,我需要能够在页面循环期间保持我的模型,因此我可以在用户单击保存按钮后将我的模型数据存储到某些sql表中。在MVC中保留模型有哪些选择?
答案 0 :(得分:8)
它只绑定表单中的输入元素(因为浏览器会发布这些元素)。标签不是POST。
您可以使用HiddenFor
..因为它们是输入元素:
@Html.HiddenFor(x => x.City)
...等。您无法使用标签发送回Controller。
LabelFor
:
<label></label> <!-- Not POST'ed by the browser -->
HiddenFor
:
<input type="hidden" /> <!-- POST'ed by the browser -->
答案 1 :(得分:0)
MVC将根据HTML标准工作,这意味着它不会回发标签元素。
使用HiddenFor
或TextboxFor
readonly
属性。
但是,如果您只显示这些值,为什么不在将它们发送到页面之前将它们放入会话中?
如果您有一个向导样式表单,您需要在将数据提交到数据库之前保存步骤之间的更改,例如,您最好的选择是将提交的值保存在您在下一步中再次读出的会话中在控制器中。否则,您可以使用值将隐藏的输入放在表单上,但这很容易被用户操纵。
答案 2 :(得分:0)
像西蒙和其他人一样解释标签没有张贴。当您想要更改某些内容时,应使用发布请求。如果您只是查看和编辑模型,则无需将其存储在会话中。
在您的视图中,您需要一个链接来编辑您的模型:
@Html.ActionLink("edit", "Edit", new {id = Model.CustomerNumber});
在您的控制器中实现您的编辑操作方法:
public ViewResult Edit(int customerNumber) {
var customer = _repository.Customers.FirstOrDefault(c => c.CustomerNumber == customerNumber);
return View(customer);
}
你需要一个Edit动作方法的视图,然后在你的表单中发布你的更新。
@using (Html.BeginForm()) {
<label>Contact Person:</label>
<input name="ContactPerson" value="@Model.ContactPerson" />
// the rest of your form
<input type="submit" value="Save" />
}
实现处理帖子的方法。确保添加HttpPost属性。
[HttpPost]
public ViewResult Edit(Customer customer) {
if (ModelState.IsValid) {
// Save your customer
return RedirectToAction("Index");
}
else {
return View(customer);
}
}
希望这有帮助。