首页 > 解决方案 > 如何防止在 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,没有更新。

这是所有这些的演示:

在此处输入图像描述

我知道我可以通过阻止更新禁用字段来在后端代码中处理这个问题。但是,如果它存在,我正在寻找一些更优雅和声明性的方式。在我的主要项目中,表单模型非常复杂,并且在对象中包含对象,因此理想情况下,我想跳过为此操作处理程序添加额外的逻辑。

标签: c#asp.net-corerazorrazor-pages

解决方案


尝试添加一个隐藏的输入来绑定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>

结果: 在此处输入图像描述


推荐阅读