C# 在Razor视图中更新模型时出现问题

C# 在Razor视图中更新模型时出现问题,c#,model-view-controller,razor,asp.net-core-mvc,razor-pages,C#,Model View Controller,Razor,Asp.net Core Mvc,Razor Pages,第一个帖子。试图解决我在Razor视图和模型之间看到的一个问题。我有一个弹出窗口,它被提供了部分视图和模型 public IActionResult ClickedCovid19Question(int id) { var existingQ = db.CustomerInfoItems.Find(id); var suffix = existingQ.Suffix; if (suffix.Length == 2)

第一个帖子。试图解决我在Razor视图和模型之间看到的一个问题。我有一个弹出窗口,它被提供了部分视图和模型

 public IActionResult ClickedCovid19Question(int id)
    {
        var existingQ = db.CustomerInfoItems.Find(id);

        var suffix = existingQ.Suffix;

        if (suffix.Length == 2)
            suffix = suffix.Insert(0, "0");

        var salesman = SalesmanHelper.GetSalesmanNum();

        var par = db.Pars.Where(p => p.AccountNo == existingQ.CustNum).Where(p => p.Suffix == suffix)
                    .Where(p => p.SalesmanNumber == salesman).FirstOrDefault();
        var clickedCovid19Model = new ClickedCovidQuestionModel
        { //insert model data here }
        
        clickedCovid19Model.Machines = db.MachinePopulationItems
            .Where(m => m.CustNum == existingQ.CustNum)
            .ToList();

        return View("~/Views/Covid19/_ClickedCovid19Question.cshtml", clickedCovid19Model);
    }
这在第一页渲染时非常有效。我看到数据填充了从razor页面上的@model调用的UI元素。当我的用户更新此处的字段并提交时,我使用此函数

function SaveClickedCovid19Question(idJS) {
    C19ParChanged('@Model.Par');
    var jsonJS = SerializeForm("#c19QuestionForm");

    $.ajax({
        url: '/Covid19/SaveClickedCovid19Question',
        type: 'GET',
        data:
        {
            id: idJS,
            json: jsonJS
        },
        success: function (data) {
            Alert(data);
            RefreshLV("CovidQuestions");
            HideWindow("#Covid19Question");
        },
        error: function (data, error, e2) {
            debugger;
        }
    });
}
但是,在关闭弹出窗口并打开另一个弹出窗口后,我们调用相同的ClickedCovid19Question IActionResult再次填充表单。它使用生成的新模型填充UI,调试显示它使用所有正确的数据创建了一个新模型。 当用户再次提交此表单时,问题就出现了,Razor视图上的模型似乎认为它仍然是第一次提交的模型。javascript函数的第一行就是一个例子。当创建Raxor视图时,它具有正确的@ Meal.Par数据,正如我可以看到的那样,当我创建了几个元素来显示它时。然而,当试图使用@模型.PAR捕获数据时,它捕获了原始模型。 长话短说,后续弹出窗口不会覆盖第一个弹出窗口中的模型数据。我被难住了,因为这个系统在我们的代码库的许多其他领域都能工作。 我可以通过创建隐藏元素来修复这个问题,这些元素将存储我在任何请求中发送的数据,但我觉得必须有一个更好的答案

编辑:下面是我用来测试的一个例子。下面的视图部分将在ID= PARID输入框中显示正确的PAR数据。但是,在第二个弹出窗口上以及之后的每一次,如果我要运行下面的简单javascript函数来查找模型持有的数据,它将始终更新到页面呈现的第一个模型的数据,这似乎与我的代码中正常工作的其他区域不一致

function updateParID() {
        $("#c19QuestionForm").find("#parID").val('@Model.Par');

    }


<input id="parID" type="text" disabled="disabled" value="@Model.Par"/>
        <partial name="Forms/_FormDropDown" model=@(new FormDropDownModel { Name = "Par", Values = Lists.ParStates(), Value = Model.CallsPerYear}) />
        <button type="submit" onclick="RefreshWindow('@Model.ID')">Refresh</button>
        <button type="submit" onclick="updateParID()">Update Par ID</button>
函数updatePaid(){
$(“#c19QuestionForm”).find(“#parID”).val(“@Model.Par”);
}
刷新
更新PAR ID
 P> > @ model .PAR(或者在@模型中的任何道具)呈现在浏览器中显示任何东西之前。
Razor页面将呈现您的视图,然后将其传递给浏览器。
因此,如果您想使用ajax获取数据,您应该手动将从ajax接收的数据放入html控件中


祝您有一个愉快的编码日:)

因此,我最终解决了这个问题。我的问题是,试图绑定来自@ Mealth.Par的数据或JavaScript函数内的任何模型数据总是使用初始模型绑定。对该函数的每次后续调用将始终只使用第一个模型。 我忽略的解决方案是首先将数据作为参数从模型发送到函数,而不是尝试将其绑定到javascript函数中

示例:我的编辑包含以下行

function updateParID() {
        $("#c19QuestionForm").find("#parID").val('@Model.Par');

    }

<button type="submit" onclick="updateParID()">Update Par ID</button>
函数updatePaid(){
$(“#c19QuestionForm”).find(“#parID”).val(“@Model.Par”);
}
更新PAR ID
当我将捕获该模型的顺序更改为:

function updateParID(parID) {
        $("#c19QuestionForm").find("#parID").val(parID);

    }

<button type="submit" onclick="updateParID('@Model.Par')">Update Par ID</button>
函数updateParID(parID){
$(“#c19QuestionForm”).find(“#parID”).val(parID);
}
更新PAR ID

现在可以正确捕获当前的模型数据。我确信javascript以这种方式工作是有原因的,但如果有人能够解释的话,我并不知道这一点。请原谅我,如果这是一个简单的答案,我是新的网络编程。谢谢大家的帮助

重新加载视图以获得刷新模型的部分在哪里@PAR是第一次从JavaScript服务的服务器。除非页面在某个地方刷新,否则不会得到任何更新。RefreshLV?您可以添加
RefreshLV
功能代码吗?如果您愿意,我仍然可以添加它,但该代码实际上会刷新此弹出窗口来自的ListView父项。我有一个许多对象的列表视图,onclick会给我一个弹出窗口,这里的代码就是这个窗口。如果数据库中的任何其他数据发生更改,RefreshLV只会更新父ListView。我可能错了,但我的假设是它们与这个问题无关。我@wlfreeman93,你能分享一下你的观点吗?确保
SaveClickedCovid19Question(idJS)
中的
idJS
正确无误。如果可能的话,请分享更详细的js代码。嗨@Rena,我添加了一个编辑,显示了视图的一部分,我认为它很好地总结了我的问题。如果您需要更多我可以添加的内容,整个视图非常大,因为它是一个相当大的表单。很抱歉,我可能没有详细解释它,但我的ajax实际上返回的只是一条“成功”消息,它将发送到我们的过度定制警报。成功后,它只会在是否命中数据库时提醒用户,在数据发生更改时刷新父ListView,并隐藏出现我的问题的弹出窗口。虽然我知道你所说的会起作用,但我只是有另一个代码几乎相同的区域,可以很好地工作,模型在每个局部视图渲染时重置为新模型,我可以处理数据,但这个弹出页面没有,