基于视图模型的动态视图

时间:2010-03-29 16:04:12

标签: asp.net-mvc viewmodel viewengine

我有一个asp.net mvc 2应用程序。我需要向每个用户显示相同的页面。但每个用户对数据拥有不同的权限。 IE有些可以看到但不能编辑某些数据,有些无法编辑也无法查看数据。理想情况下,无法查看或编辑的数据是视图上的空白。出于安全考虑,我希望我的viewmodels尽可能稀疏。我的意思是,如果无法查看或编辑字段,则该字段不应位于视图模型上。显然我可以为每个视图模型编写视图,但这看起来很浪费。所以这是我的想法/愿望清单

我可以使用属性装饰viewmodel并挂钩到html助手的预渲染事件,并告诉它做 而不是???

我是否可以为viewmodel上找不到的条目输出html助手?{/ p>?

我可以轻松地将构建的视图转换为代码然后编程构建标记,然后放入渲染引擎进行处理并在客户端以html的形式查看吗?

1 个答案:

答案 0 :(得分:0)

你表达这个问题的方式,我担心任何答案都会导致一个非常复杂的观点。根据用户的角色决定要显示的视图(以及要构建的视图模型)是控制器的责任。

编辑1:对评论的回应

你可以这样做吗?

<% if (Model.AllowEdit) { %>
    <%= Html.TextBoxFor(x => x.SomeProperty); %>
<% } else if (Model.AllowView) { %>
    <%= Html.Encode(Model.SomeProperty) %>
<% } else { %>
    <span>You may not view this property.</span>
<% } %>

这可以转化为辅助控制。

public static ExtensionsOfHtmlHelper
{
    public static MvcHtmlString DynamicTextBox(this HtmlHelper html, Func<TModel, object> lambda, bool edit, bool view)
    {
        if (edit)
        {
            return html.TextBoxFor(lambda);
        }
        else if (view)
        {
            return html.LabelFor(lambda);
        }
        else
        {
            return MvcHtmlString.Create("<span>You may not view this value.</span>");
        }
    }
}

然后,在您看来,

<%= Html.DynamicTextBox(x => x.SomeProperty, Model.AllowEdit, Model.AllowView) %>

接近这一点应该有用。