在 Razor 视图中更新模型时出现问题
Issue with Updating Model in Razor View
首先post。尝试解决我在 Razor 视图和模型之间看到的问题。我有一个弹出窗口 window 正在提供部分视图和模型。
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);
}
这在第一页呈现时效果很好。我看到数据填充了我的 UI 元素,这些元素是从 razor 页面上的 @model 调用的。当我的用户在这里更新一个字段并提交时,我使用这个函数
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;
}
});
}
但是,在关闭弹出窗口 window 并打开另一个弹出窗口后,我们调用相同的 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(或您在@Model 中拥有的任何道具)在浏览器中显示任何内容之前呈现。
Razor 页面将呈现您的视图,然后将其传递给浏览器。
因此,如果您想使用 ajax 获取数据,您应该手动将从 ajax 收到的数据放入 html 控件中。
祝你编码愉快:)
所以,我实际上最终解决了这个问题。我的问题是,尝试绑定来自 @Model.Par 的数据或 javascript 函数内的任何模型数据将始终使用初始模型进行绑定。对该函数的每次后续调用将始终只使用第一个模型。
我忽略的解决方案是首先将数据作为参数从模型实际发送到函数,而不是尝试将其绑定到 javascript 函数中。
示例:我的编辑有这些行
function updateParID() {
$("#c19QuestionForm").find("#parID").val('@Model.Par');
}
<button type="submit" onclick="updateParID()">Update Par ID</button>
当我将捕获该模型的顺序更改为:
function updateParID(parID) {
$("#c19QuestionForm").find("#parID").val(parID);
}
<button type="submit" onclick="updateParID('@Model.Par')">Update Par ID</button>
这现在可以正确捕获存在的模型数据。我确信 javascript 以这种方式工作是有原因的,但我不知道是否有人可以阐明它。如果这是一个简单的答案,请原谅我,我是网络编程的新手。谢谢大家的帮助!
首先post。尝试解决我在 Razor 视图和模型之间看到的问题。我有一个弹出窗口 window 正在提供部分视图和模型。
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);
}
这在第一页呈现时效果很好。我看到数据填充了我的 UI 元素,这些元素是从 razor 页面上的 @model 调用的。当我的用户在这里更新一个字段并提交时,我使用这个函数
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;
}
});
}
但是,在关闭弹出窗口 window 并打开另一个弹出窗口后,我们调用相同的 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(或您在@Model 中拥有的任何道具)在浏览器中显示任何内容之前呈现。 Razor 页面将呈现您的视图,然后将其传递给浏览器。 因此,如果您想使用 ajax 获取数据,您应该手动将从 ajax 收到的数据放入 html 控件中。
祝你编码愉快:)
所以,我实际上最终解决了这个问题。我的问题是,尝试绑定来自 @Model.Par 的数据或 javascript 函数内的任何模型数据将始终使用初始模型进行绑定。对该函数的每次后续调用将始终只使用第一个模型。 我忽略的解决方案是首先将数据作为参数从模型实际发送到函数,而不是尝试将其绑定到 javascript 函数中。
示例:我的编辑有这些行
function updateParID() {
$("#c19QuestionForm").find("#parID").val('@Model.Par');
}
<button type="submit" onclick="updateParID()">Update Par ID</button>
当我将捕获该模型的顺序更改为:
function updateParID(parID) {
$("#c19QuestionForm").find("#parID").val(parID);
}
<button type="submit" onclick="updateParID('@Model.Par')">Update Par ID</button>
这现在可以正确捕获存在的模型数据。我确信 javascript 以这种方式工作是有原因的,但我不知道是否有人可以阐明它。如果这是一个简单的答案,请原谅我,我是网络编程的新手。谢谢大家的帮助!