ASP.NET 核心 ViewData、BindProperty 还是 TempData?
ASP.NET Core ViewData, BindProperty or TempData?
在 ASP.NET 核心视图和 Razor 页面中,我们可以使用:
public class LoginModel
{
[BindProperty]
public bool DisplayCaptcha { get; set; }
// OR
[ViewData]
public bool DisplayCaptcha { get; set; }
// OR
[TempData]
public bool DisplayCaptcha { get; set; }
}
要在 View/Page/Controller 之间共享数据...
但是什么时候使用它们?
在我的例子中,它是一个简单的登录页面,当用户设置了错误的密码时,我将显示一个验证码。
在表单 post 中,我将 属性 设置为 true (DisplayCaptcha = true
) 并使用验证码呈现页面:
@if (Model.DisplayCaptcha)
{
<div class="captcha-header">
...
</div>
}
这工作正常,但我不太清楚属性应该是什么类型,或者即使我应该使用任何类型。
我们使用 ViewData 和 TempData 在回发期间维护对象的状态。但是因为你在每次回发时设置它的值并且它是模型的一部分所以它应该是 [BindProperty].
ViewData
当数据从 PageModel 传递到 Page 时应该使用。
BindProperty
当数据从 PageModel 传递到 Page 时应该使用 BindProperty
,反之亦然通过 POST/GET。这是双向绑定。
TempData
应该只读一次数据。
在您的情况下,您应该使用 BindProperty
。
在 ASP.NET 核心视图和 Razor 页面中,我们可以使用:
public class LoginModel
{
[BindProperty]
public bool DisplayCaptcha { get; set; }
// OR
[ViewData]
public bool DisplayCaptcha { get; set; }
// OR
[TempData]
public bool DisplayCaptcha { get; set; }
}
要在 View/Page/Controller 之间共享数据... 但是什么时候使用它们?
在我的例子中,它是一个简单的登录页面,当用户设置了错误的密码时,我将显示一个验证码。
在表单 post 中,我将 属性 设置为 true (DisplayCaptcha = true
) 并使用验证码呈现页面:
@if (Model.DisplayCaptcha)
{
<div class="captcha-header">
...
</div>
}
这工作正常,但我不太清楚属性应该是什么类型,或者即使我应该使用任何类型。
我们使用 ViewData 和 TempData 在回发期间维护对象的状态。但是因为你在每次回发时设置它的值并且它是模型的一部分所以它应该是 [BindProperty].
ViewData
当数据从 PageModel 传递到 Page 时应该使用。
BindProperty
当数据从 PageModel 传递到 Page 时应该使用 BindProperty
,反之亦然通过 POST/GET。这是双向绑定。
TempData
应该只读一次数据。
在您的情况下,您应该使用 BindProperty
。