在ASP.NET MVC中,为什么新的输入会在回发时保持不变?

时间:2011-12-29 20:40:27

标签: asp.net-mvc entity-framework

这个问题与大多数人有点不同。我的代码有效,但我不明白为什么它有效。

我试图理解为什么在发布到服务器后,表单中所做的更改会保持不变。

型号:

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" />
}

EditorTemplate

@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对象并清除我的更改,以便在返回视图时重新显示原始值。但实际发生的是我对表单的更改会持续到回发。

为什么会这样?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

没有。原因是View Engine在模型状态中查看模型,在它呈现视图时查看模型。如果有发布的值,那么它将首先找到它们并使用它们。

如果要覆盖此行为,则需要首先使用以下命令清除ModelState:

ModelState.Clear();