我完全为为什么视图模型中的Razor页面显然没有内容而为何会生成内容。为了对此进行测试,我在同一个应用程序内创建了一个测试视图模型,控制器和剃刀页面来演示该问题。
此证明/测试的目标很简单:提供一个简单的表格,在接收控制器中明确清除内容,并退回空白表格给用户。
问题在于,即使明确清除了这三个模型字段,剃刀页面仍正在生成先前提交的内容(如调试中检查所确认的那样)在下面的截图中。
我什至在services.AddResponseCaching();
文件中将Startup.cs
注释掉了。
代码如下:
[HttpGet]
public IActionResult TestForm(int id)
{
ViewModels.TestFormViewModel viewModel = new ViewModels.TestFormViewModel();
return View(viewModel);
}
[HttpPost]
public IActionResult TestForm(int id, ViewModels.TestFormViewModel viewModel)
{
// The following should clear out the three text fields:
viewModel.TestField1 = ""; // See if empty string works.
viewModel.TestField2 = null; // See if null works.
viewModel.TestField3 = null;
return View(viewModel);
}
namespace MyApp.ViewModels
{
public class TestFormViewModel
{
[Section("1")]
public string TestField1 { get; set; }
[Section("1")]
public string TestField2 { get; set; }
[Section("1")]
public string TestField3 { get; set; }
}
}
@model MyApp.ViewModels.TestFormViewModel
@{
ViewData["Title"] = "Test Page";
}
<p>The input on this page should be cleared every time it's submitted:</p>
<form name="myapp-form" id="myapp-form" method="post" class="form-horizontal">
<div>
<input asp-for="TestField1" />
</div>
<div>
<input asp-for="TestField2" />
</div>
<div>
<input asp-for="TestField3" />
</div>
<button type="submit">Submit</button>
</form>
如下面的调试镜头所示,代码检查器显示1)代码正确路由了POST请求,2)视图模型的三个字符串属性已清除提交的输入(一个为null) ,其他使用空字符串):
然后,检查剃须刀页面的this.Model
,我确认三个字符串属性与控制器交给剃须刀页面的完全相同:
然而,剃刀页面正在生成<input>
标签,这些标签具有由控制器提交(但已清除!)的确切内容:
以下是HTML格式(直接从HTTP响应的正文中捕获,不是,由“查看源代码”捕获),确认<input>
标记的“值”属性包含数据与上面提供给剃刀页面的视图模型不同。
<form name="myapp-form" id="myapp-form" method="post" class="form-horizontal">
<div>
<input type="text" id="TestField1" name="TestField1" value="This test" />
</div>
<div>
<input type="text" id="TestField2" name="TestField2" value="should be" />
</div>
<div>
<input type="text" id="TestField3" name="TestField3" value="cleared out" />
</div>
<button type="submit">Submit</button>
<input name="__RequestVerificationToken" type="hidden" value="[token redacted]" />
</form>
以上所有(似乎)证明浏览器无法插入或填充此数据。
为什么剃须刀页面生成的内容不在模型中?
我已经尽力想了一切,但仍然无法确定为什么会这样。 ASP核心专家可以帮助我吗?