POST期间调用默认构造函数,我将丢失所有模型数据

本文关键字:数据 模型 调用 默认 构造函数 POST | 更新日期: 2023-09-27 18:29:26

我遇到了一个问题,表单正在返回,模型正在丢失。页面一发布回来,.net就调用该对象的默认构造函数,即使该对象已经存在。

我有两个操作,一个用于GET,另一个用于POST

        [HttpGet]
        public ActionResult Quote(string sku, string network, string grade )
        {
            QuoteModel qm = new QuoteModel();
            // build model here
            return View("Quote", qm);
        }
        [HttpPost]
        public ActionResult Quote(QuoteModel qm, string grade, string network)
        {
            // update model
            return View("Quote",qm);
        }

GET函数运行得很好,但表单一发布,就会调用默认构造函数,我就会丢失所有的模型数据。

我的观点是:

@model PriceCompare.Models.QuoteModel
    <div class="clarify">
        @if (Model.clarify == true)
        {

            using (Html.BeginForm("Quote", "Home", FormMethod.Post))
            {
            @Html.DropDownList("network", Model.availableNetworks);
            @Html.DropDownList("grade", Model.grades);
            <button type="submit">Get Quote</button>
            }
        }
    </div>

当存在要传递的现有模型时,为什么要调用默认构造函数?

我已经尝试以如下形式指定模型:

using (Html.BeginForm("Quote", "Home", new { @qm = Model}, FormMethod.Post)

如果我这样做,则不会调用默认构造函数,但qm为null。

我一直在这里兜圈子,试图弄清楚这一点。有人能解释我做错了什么吗?

POST期间调用默认构造函数,我将丢失所有模型数据

您可以通过重载构造函数来解决这个问题,并且只显式调用布尔参数设置为true的第二个构造函数。

型号

public class MyModel
{
    public int NumberRequested { get; set; }
    // This constructor will be called by MVC
    public MyModel()
    {
        RefreshReport();
    }
    // Call this constructor explicitly from the controller
    public MyModel(bool load)
    {
        if (!load)
        {
            return;
        }
        NumberRequested = 10;
        RefreshReport();
    }
    public void RefreshReport()
    {
        // Do something
    }
}

施工单位

public class MyController
{
    public ActionResult MyView()
    {
        var myModel = new MyModel(true);
        return View(myModel);
    }
    [HttpPost]
    public ActionResult MyView(MyModel myModel)
    {
        myModel.RefreshReport();
        return View(myModel);
    }
}