【发布时间】:2021-07-23 07:22:07
【问题描述】:
第一次发帖。尝试解决我在 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);
}
这在第一页渲染时效果很好。我看到数据填充了从剃刀页面上的@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 函数的第一行。创建 razor 视图时,它具有正确的 @Model.Par 数据,正如我在创建一些元素来显示它时所看到的那样。但是,当尝试使用 @Model.Par 捕获该数据时,它会捕获原始 Model.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>
【问题讨论】:
-
您重新加载视图以获取刷新模型的部分在哪里? @Model.Par 在第一次提供 javascript 时来自服务器。除非页面在某处刷新,否则它没有得到任何更新。刷新LV?
-
可以添加
RefreshLV功能码吗? -
如果您愿意,我仍然可以添加它,但该代码实际上会刷新此弹出窗口来自的 ListView 父项。我有一个包含许多对象的 ListView,onclick 给了我这个代码所在的弹出窗口。如果进入我们数据库的任何其他数据发生更改,RefreshLV 只会更新该父 ListView。我可能是错的,但我的假设是它们与这个问题无关
-
嗨@wlfreeman93,你能分享你的观点吗?确保
SaveClickedCovid19Question(idJS)中的idJS是正确的。可以的话,请分享更详细的js代码。 -
嗨@Rena,我添加了一个编辑,显示了我认为很好地总结了我的问题的部分视图。如果您需要更多我可以添加,整个视图非常大,因为它是一个相当大的表单。
标签: c# model-view-controller razor asp.net-core-mvc razor-pages