ASP Core剃须刀页面生成的数据与视图模型不同

时间:2019-07-19 21:43:22

标签: asp.net-core razor-pages

我完全为为什么视图模型中的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; }
    }
}

剃刀页面(.cshtml)

@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) ,其他使用空字符串):

inspecting the view model in the controller

然后,检查剃须刀页面的this.Model,我确认三个字符串属性与控制器交给剃须刀页面的完全相同:

inspecting this.Model of the razor page

然而,剃刀页面正在生成<input>标签,这些标签具有由控制器提交(但已清除!)的确切内容:

form output by the razor page after submit

以下是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核心专家可以帮助我吗?

0 个答案:

没有答案