发布时如何清除 Razor 页面模型上的绑定 属性?
How can you clear a bound property on a Razor Page's model when POSTing?
我有一个绑定到输入字段的 属性:
<input id="name" asp-for="ContactName" name="ContactName" placeholder="Name" type="text" style="width: 200px !important;" autofocus>
[BindProperty]
public string ContactName { get; set; }
当我 POST 时,我尝试通过将 ContactName
属性 设置为 NULL 或 string.Empty 来清除它,但它不起作用。
清除该字段的正确方法是什么?
"proper"方式是遵循PRG(Post-Redirect-Get)模式。您输入的值来自 ModelState
,而不是 Model
。 ModelState
本身由 Request
、ViewData
/ViewBag
和 finally 模型的值组成。换句话说,如果绑定成员的值存在于 Request
之类的东西中,则该值将优先于您在模型上设置的任何值。
PRG 模式指示您只应 return 在出现验证错误时将视图返回给用户。在这种情况下,您希望 显示 posted 数据而不是模型上的数据,以便用户可以更正任何错误。如果用户的输入有效,您将重定向,即使它返回到同一页面。重定向操作会清除 post 中的所有内容。就好像你是第一次来到这个页面,因为实际上,这是一个全新的 GET 请求。
不想遵循 PRG 模式可能有正当理由。例如,您可能正在使用像 HTMX 这样的库,您希望在其中处理 post 数据,然后 return Partial 作为直接来自 OnPost 方法的响应。以下是对我有用的方法。修改模型值后,调用 ModelState.Clear()
,这将清除模型中的所有错误并强制使用新值“重建”模型。然后 return 你的 Page()
或者,在下面的例子中,你的 Partial
public IActionResult OnPost()
{
// process your post data...
ContactName = String.Empty;
ModelState.Clear();
return Partial("_MyPartialView",this);
}
我有一个绑定到输入字段的 属性:
<input id="name" asp-for="ContactName" name="ContactName" placeholder="Name" type="text" style="width: 200px !important;" autofocus>
[BindProperty]
public string ContactName { get; set; }
当我 POST 时,我尝试通过将 ContactName
属性 设置为 NULL 或 string.Empty 来清除它,但它不起作用。
清除该字段的正确方法是什么?
"proper"方式是遵循PRG(Post-Redirect-Get)模式。您输入的值来自 ModelState
,而不是 Model
。 ModelState
本身由 Request
、ViewData
/ViewBag
和 finally 模型的值组成。换句话说,如果绑定成员的值存在于 Request
之类的东西中,则该值将优先于您在模型上设置的任何值。
PRG 模式指示您只应 return 在出现验证错误时将视图返回给用户。在这种情况下,您希望 显示 posted 数据而不是模型上的数据,以便用户可以更正任何错误。如果用户的输入有效,您将重定向,即使它返回到同一页面。重定向操作会清除 post 中的所有内容。就好像你是第一次来到这个页面,因为实际上,这是一个全新的 GET 请求。
不想遵循 PRG 模式可能有正当理由。例如,您可能正在使用像 HTMX 这样的库,您希望在其中处理 post 数据,然后 return Partial 作为直接来自 OnPost 方法的响应。以下是对我有用的方法。修改模型值后,调用 ModelState.Clear()
,这将清除模型中的所有错误并强制使用新值“重建”模型。然后 return 你的 Page()
或者,在下面的例子中,你的 Partial
public IActionResult OnPost()
{
// process your post data...
ContactName = String.Empty;
ModelState.Clear();
return Partial("_MyPartialView",this);
}