0

我有多个使用@Html.TextBoxFor() 定义的文本框。现在我希望它们中的一些只是“只读”的,其中一些是可编辑的,基于用户访问页面的角色。

我试过使用以下

@Html.TextBoxFor(f => f.VSSLabel, new { style = "height:19px", @Value = @ViewBag.fetchf.VSSLabel, @readonly="readonly" })

有什么方法可以设置 @readonly="false" 并使其变为可编辑,或者任何其他方法,以便我根据存储在来自控制器的 ViewBag 变量中的值将其切换为“只读”和可编辑?

4

4 回答 4

3

不幸的是,以下所有标记都将呈现只读文本框输入

<input type="text" name="s1" readonly="readonly"/>
<input type="text" name="s2" readonly="no" />
<input type="text" name="s2" readonly="reallyDoNotWant" />
<input type="text" name="s3" readonly="false" />
<input type="text" name="s4" readonly />

属性的存在readonly使输入元素只读。价值无所谓。

所以你应该有条件地渲染它

if (yourExpressionWhichGivesBooleanValue)
{
    @Html.TextBoxFor(a => a.VSSLabel)
}
else
{
    @Html.TextBoxFor(a => a.VSSLabel, new { @readonly = "readonly" })
}

如果您想根据 viewbag 字典项对其进行检查

if (ViewBag.IsAdmin !=null && ViewBag.IsAdmin)
{
    @Html.TextBoxFor(a => a.VSSLabel)
}
else
{
    @Html.TextBoxFor(a => a.VSSLabel, new { @readonly = "readonly" })
}

假设您在操作方法中设置ViewBag.IsAdmin为布尔值。

于 2017-11-14T19:39:29.627 回答
1

Shyju 的说法是正确的,但是 Shariq Ali 是正确的,如果你有很多领域要做,那么 Razor 代码的效率就会很低。

就我而言,我有一个完整的表格,我想在某些情况下将其设为只读。我发现的其中一种方法可以用更少的编码来解决您的问题。

@{
object htmlAttr = null;

if ( ViewBag.AllowEdit != null && !ViewBag.AllowEdit ){
    htmlAttr = new { @class="CSS", @readonly="readonly"};
}
else {
    htmlAttr = new { @class="CSS" };
}

@Html.TextBoxFor( m => m.Field, htmlAttr)

由于表单中的大多数编辑控件都带有相同的 CSS 类,因此应该可以满足大部分需求。如果您发现某些控件需要更多类,只需添加额外的 htmlAttribute 对象来承载不同的类配置。

通过使用描述性变量名称,这集中了只读逻辑并使您的剃须刀页面更加简洁。

于 2020-04-21T13:06:05.233 回答
0

为了使您的代码更易于阅读,您可以使用可以声明的函数:

@functions
{
    private object GetAttributes()
    {
        if (ViewBag.IsAdmin !=null && ViewBag.IsAdmin)
        {
            return null;
        }

        return new { @readonly = "readonly" };
    }
}

然后你可以像这样使用它:

@Html.TextBoxFor(a => a.VSSLabel, GetAttributes())

在函数中,您可以添加需要添加到元素的任何属性:

return new { @class = "form-control", @readonly = "readonly", @required = "required" }

它工作得很好

于 2019-12-16T14:40:27.293 回答
0

你可以写一个这样的扩展方法:

/* for .NET Core       */ using Microsoft.AspNetCore.Mvc.ViewFeatures;
/* for .NET Framework: */ using System.Web.WebPages.Html;

public static class HtmlHelpers
{
    public static object MakeReadonly(this object htmlAttributes, bool isReadonly)
    {
        if (isReadonly)
        {
            var dynamicHtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
            dynamicHtmlAttributes["readonly"] = "readonly";
            return dynamicHtmlAttributes;
        }

        return htmlAttributes;
    }
}

用法:

@Html.TextBoxFor(..., new { @class = "form-control" }.MakeReadonly(true))

这种方法的一个缺点是,扩展方法object有点可疑,因为它们会在 IntelliSense 中随处出现。

如果您不喜欢这样,我建议将htmlAttributes匿名对象更改为 aViewDataDictionary并使扩展方法与它一起使用。

于 2020-01-16T17:55:05.440 回答