3

我有一个包含大约 50 个字段的视图。如果用户不是管理员,我需要能够将其中大约一半设置为禁用。这样做的正确方法是什么?我认为有比简单地执行以下 25 次更好的方法吗?

    @if (User.IsInRole("Admin") == false)
    {
        @Html.TextBoxFor(m => m.AssociateName, new {disabled = "true"})
    }
4

3 回答 3

4

执行此操作的正确方法是创建两个视图,管理员和非管理员,然后在确定角色后呈现适当的视图。

于 2013-09-23T17:16:07.997 回答
3

好吧,您可以将其简化为如下所示:

@{
    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 上验证这一点,否则您很容易受到非管理员用户的模型注入。

于 2013-09-23T17:22:27.063 回答
0

您应该记住几件事。

  • 当属性disabled存在时,输入将被禁用。无论您输入disabled="true"or disabled="false"disabled- 在所有这些情况下,输入都将被禁用。这就是@Ant_P 答案中的第一个建议不起作用的原因。

  • 禁用的输入不会提交到 MVC 中的服务器。完全没有。处理此问题的更好方法是使用属性readonly

  • 更改 html 并删除disabledreadonly属性非常简单。在这种情况下,用户将能够更改输入的值。考虑安全。根本不渲染输入可能会更好。

您可以创建一个自定义 html 帮助程序来接受输入是否为只读的,或者类似于它在TwitterBootstrapMVC中的完成方式:

@Html.Bootstrap().TextBoxFor(x => x.Property).Readonly(User.IsInRole("Admin"))
于 2013-09-23T17:34:04.817 回答