这个问题与大多数人有点不同。我的代码有效,但我不明白为什么它有效。
我试图理解为什么在发布到服务器后,表单中所做的更改会保持不变。
public class TestUpdateModel
{
public int Id { get; set; }
public List<CarrierPrice> Prices { get; set; }
public TestUpdateModel() { } // parameterless constructor for the modelbinder
public TestUpdateModel(int id)
{
Id = id;
Prices = new List<CarrierPrice>();
using (ProjectDb db = new ProjectDb())
{
var carriers = (from c in db.Carriers
select c);
foreach (var item in carriers)
{
var thesePrices = item.Prices.Where(x => x.Parent.ParentId == Id);
if (thesePrices.Count() <= 0)
{
Prices.Add(new CarrierPrice
{
Carrier = item
});
}
else
Prices.Add(thesePrices.OrderByDescending(x => x.DateCreated).First());
}
}
}
}
public ViewResult Test(int id = 1)
{
TestUpdateModel model = new TestUpdateModel(id);
return View(model);
}
[HttpPost]
public ViewResult Test(TestUpdateModel model)
{
model = new TestUpdateModel(model.Id);
return View(model); // when model is sent back to view, it keeps the posted changes... why?
}
@model Namespace.TestUpdateModel
@{ ViewBag.Title = "Test"; }
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Id)
@Html.EditorFor(x => x.Prices)
<input type="submit" value="Save" />
}
@model Namespace.CarrierPrice
<tr>
<th>
@Html.HiddenFor(model => model.CarrierPriceId)
@Html.HiddenFor(model => model.DateCreated)
@Model.Carrier.Name
</th>
<td>
$@Html.TextBoxFor(model => model.Fee)
</td>
</tr>
1)在浏览器中加载页面
2)更改model.fee TextBox的值
3)提交
此时我希望model = new TestUpdateModel(model.Id);
将创建一个新的TestUpdateModel对象并清除我的更改,以便在返回视图时重新显示原始值。但实际发生的是我对表单的更改会持续到回发。
为什么会这样?
感谢您的帮助。
答案 0 :(得分:2)
没有。原因是View Engine在模型状态中查看模型,在它呈现视图时查看模型。如果有发布的值,那么它将首先找到它们并使用它们。
如果要覆盖此行为,则需要首先使用以下命令清除ModelState:
ModelState.Clear();