我有一个包含大约 50 个字段的视图。如果用户不是管理员,我需要能够将其中大约一半设置为禁用。这样做的正确方法是什么?我认为有比简单地执行以下 25 次更好的方法吗?
@if (User.IsInRole("Admin") == false)
{
@Html.TextBoxFor(m => m.AssociateName, new {disabled = "true"})
}
我有一个包含大约 50 个字段的视图。如果用户不是管理员,我需要能够将其中大约一半设置为禁用。这样做的正确方法是什么?我认为有比简单地执行以下 25 次更好的方法吗?
@if (User.IsInRole("Admin") == false)
{
@Html.TextBoxFor(m => m.AssociateName, new {disabled = "true"})
}
执行此操作的正确方法是创建两个视图,管理员和非管理员,然后在确定角色后呈现适当的视图。
好吧,您可以将其简化为如下所示:
@{
bool isAdmin = User.IsInRole("Admin");
}
@Html.TextBoxFor(m => m.AssociateName, isAdmin ? new { disabled = "disabled" } : new {})
或者您可以创建一个编辑器模板来为您完成它:
@model string
@Html.TextBoxFor(m => m User.IsInRole("Admin") ? new { disabled = "disabled" } : new {})
模型:
[UIHint("_MyEditorTemplate")]
public string MyProperty { get; set; }
主视图:
@Html.EditorFor(m => m.MyProperty)
或者你可以有条件地从你的控制器渲染不同的视图:
if (User.IsInRole("Admin"))
{
return View("AdminView", model);
}
else
{
return View("UserView", model);
}
我想说所有这些都是有效的方法,这取决于您需要多少其他灵活性(以及您是否需要在 GET 操作中基于此执行任何其他逻辑)。
请记住,无论哪种方式,您都应该在对发布的任何值采取行动之前在您的 POST 上验证这一点,否则您很容易受到非管理员用户的模型注入。
您应该记住几件事。
当属性disabled存在时,输入将被禁用。无论您输入disabled="true"
or
disabled="false"
或disabled
- 在所有这些情况下,输入都将被禁用。这就是@Ant_P 答案中的第一个建议不起作用的原因。
禁用的输入不会提交到 MVC 中的服务器。完全没有。处理此问题的更好方法是使用属性readonly
更改 html 并删除disabled或 readonly属性非常简单。在这种情况下,用户将能够更改输入的值。考虑安全。根本不渲染输入可能会更好。
您可以创建一个自定义 html 帮助程序来接受输入是否为只读的,或者类似于它在TwitterBootstrapMVC中的完成方式:
@Html.Bootstrap().TextBoxFor(x => x.Property).Readonly(User.IsInRole("Admin"))