c# - 如何防止在 ASP.NET Core 的 Razor 视图 HTML 中禁用或只读输入文件的模型绑定?
问题描述
所以我有复杂的对象应该显示在页面上。对于某些访问角色的用户,应该禁用(或只读)此对象的某些属性。但是,我注意到如果我<input disabled .../>
在 devtools 中编辑它并删除属性并添加任意文本,那么模型绑定器会很高兴地采用这个值并在通过操作disabled
提交时将其放入表单模型中。OnPost
这是示例代码:
<form method="post">
<div class="form-group col-sm-6">
<label asp-for="FormModel.FirstName" class="control-label">First Name</label>
<input asp-for="FormModel.FirstName"
disabled="disabled"
class="form-control"
/>
</div>
<div class="form-group col-sm-6">
<label asp-for="FormModel.LastName" class="control-label">Last Name</label>
<input asp-for="FormModel.LastName"
class="form-control"
/>
</div>
<input type="submit" value="Save" class="btn btn-primary" />
</form>
和页面模型:
public class IndexModel : PageModel
{
private readonly MyDbMock _myDb;
[BindProperty]
public FormModel FormModel { get; set; }
public IndexModel(MyDbMock myDb)
{
_myDb = myDb;
}
public void OnGet()
{
FormModel = new FormModel
{
FirstName = _myDb.FormModel.FirstName,
LastName = _myDb.FormModel.LastName
};
}
public IActionResult OnPost()
{
_myDb.FormModel = FormModel;
return RedirectToAction(nameof(OnGet));
}
}
public class FormModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class MyDbMock
{
public FormModel FormModel { get; set; } = new FormModel
{
FirstName = "John",
LastName = "Smith"
};
}
当我第一次打开这个页面时,我进入了带有标签John
的禁用输入。First name
这可以。然后,当我单击Save
我的OnPost
方法时,将获取为 null 的FormModel
对象。FirstName
这反映在更新的页面中。可以防止这种情况并告诉模型绑定器不要触摸此属性吗?IE。将其保留John
为提交表单时,而不是null
因为它被禁用而将其设置为?
我遇到的另一个问题是高级用户可以disabled
从输入中删除属性First Name
并提交任意值。这也可以通过告诉模型绑定器与上述相同的事情来防止吗?例如。在请求中发送字段时保持First Name
原样GET
,没有更新。
这是所有这些的演示:
我知道我可以通过阻止更新禁用字段来在后端代码中处理这个问题。但是,如果它存在,我正在寻找一些更优雅和声明性的方式。在我的主要项目中,表单模型非常复杂,并且在对象中包含对象,因此理想情况下,我想跳过为此操作处理程序添加额外的逻辑。
解决方案
尝试添加一个隐藏的输入来绑定FormModel.FirstName
,并更改禁用输入的名称,使禁用输入的值不会被绑定到FormModel.FirstName
。
<form method="post" >
<div class="form-group col-sm-6">
<label asp-for="FormModel.FirstName" class="control-label">First Name</label>
<input asp-for="FormModel.FirstName" name="FirstName"
disabled="disabled"
class="form-control" />
<input asp-for="FormModel.FirstName" hidden/>
</div>
<div class="form-group col-sm-6">
<label asp-for="FormModel.LastName" class="control-label">Last Name</label>
<input asp-for="FormModel.LastName"
class="form-control" />
</div>
<input type="submit" value="Save" class="btn btn-primary" />
</form>
推荐阅读
- c++ - 为什么 std::filesystem::path::root_name() 返回空字符串?
- xamarin - Xamarin.Android 中的错误:“Emgu.CV.CvInvoke”的类型初始化程序引发异常
- python - 无法在 python 3.8 上将带有 webapp 的 python 部署到天蓝色
- ios - Xcode中UICollectionsView的单元格没有出现
- python - Python:在处理文件之前检查文件是否可以读取
- c# - 安装 WinForms 后是否可以自动更新 Nuget 包?
- javascript - 打字稿对象作为函数参数
- html - 我应该如何在 app.module.ts 中导入 MatDrawer 和 MatDrawerContainer?角度 9
- lxd - 如何在 WSL2 中启动 LXD 容器?
- java - 在java程序中使用局部变量有什么好处?