【问题标题】:Hiding/Showing properties and ordering properties in MVC在 MVC 中隐藏/显示属性和排序属性
【发布时间】:2014-09-15 00:11:53
【问题描述】:

我即将将我们的软件从 ASP.NET WebForms 升级到 .NET MVC。在整个网络上,它展示了如何基于模型创建视图,这很好。

在这个项目中,用户可以隐藏模型的属性以生成适合他们的视图,另一个网站中的另一个客户端并隐藏其他属性。

代码都是一样的,但我想知道是否有一种方法可以轻松地根据条件隐藏/显示模型的属性,希望在我的视图中没有大量的 IF 语句。

示例 - 一个客户如何只能看到名称和城镇,而另一个客户如何看到所有 3 个属性。只需要根据条件显示即可。

public class MyObject() {

    public property name { get; set; };
    public property town { get; set; };
    public property customText { get; set; }

    public MyObject() {}
}

注意:用户还可以确定这些属性的顺序,我也可以轻松地做到这一点吗?

只是说创建单独的视图是不可能的。上面是一个非常简单的带有属性的模型示例。我们的模型可以有大约 100 个属性,用户可以随时打开和关闭这些属性,因此需要能够动态完成

有没有办法即时创建 ViewModel?

提前致谢

【问题讨论】:

  • 你可以创建单独的视图并根据角色显示特定视图
  • 您可以过滤您的模型,例如在控制器上,并将这个“过滤”模型发送到视图。例如,您可以创建数据库表,其中每个用户映射您要使用它们呈现的属性的数量,然后在控制器中访问此数据库并根据您从数据库中获得的信息构建模型对象。
  • 构建对象模型(动态)听起来很有趣。你有一个简单的例子,或者我可以看到这个的链接吗?
  • 我想我真的在这里找到了一些东西gregshackles.com/2010/09/…
  • 如果您想使用ExpandoObject 的“动态模型”,那么只需使用ViewBag,它就是ExpandoObject

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

创建一个Property 类或类似的类并适当地为您的数据建模:

public class Property
{
    public string Name {get;set;}
    public bool Visible {get;set;}
    public int Order {get;set;}
}

那么您的视图模型可以类似于您的示例:

public class ViewModel 
{        
    public Property Name {get;set;}
    public Property Town {get;set;}
    public Property CustomText {get;set;}
}

【讨论】:

  • 这是一个好的解决方案吗?您是否必须使用大量 If 语句填充 View 以查看它是否应该写入属性?
  • 您可以只为“属性”类型编写显示和编辑器模板,然后将逻辑放入其中一次。那么你需要的只是@Html.DisplayFor(x => x.Name)等。
【解决方案2】:

您不能将多个模型绑定到您的视图。显然您必须根据用户角色在您的视图中解决问题。 或者为每个用户角色创建一个单独的模型和视图。

【讨论】:

    【解决方案3】:

    我一直在从事一个名为 Dynamic MVC 的项目。

    http://dynamicmvc.com

    它目前不符合您的要求。该功能已经存在,只是没有按照您需要的方式公开。但是,如果您有兴趣,我将添加该功能,以便您可以传递要在查询字符串中显示的属性。最终,一个可定制的动态视图将为您生成您的页面,而无需任何编码。此外,属性的顺序将决定您页面上的顺序。这适用于任何具有 DynamicEntity 属性的模型。

    如果您有兴趣,请告诉我,我可以将其包含在下一个版本中。

    【讨论】:

    • Chris spumds 很有趣。那会很好。给我一个链接,我可以下载并尝试。萨克斯
    • 我在 codeplex (dynamicmvc.codeplex.com/workitem/1645) 上为此创建了一个工作项。我在 nugget (nuget.org/packages/DynamicMVC/1.1.0) 上发布了 1.1.0 版。您可以按照自述文件中的说明开始。最好在一个新项目中对其进行测试。如果您已经为实体指定了控制器,它将不会被路由到动态控制器。您可以通过自己调用控制器或从动态控制器继承来获得该功能。另请参阅dynamicmvc.com/Tutorial 上的教程。
    • 请在此处留下反馈/问题dynamicmvc.codeplex.com/discussions/566755
    • 我忘了提到,您需要通过在查询字符串中将它们作为“ViewProperties = Name, Town”传递来指定要显示的属性。
    • 我可以展示很多属性。你可以通过属性而不是查询字符串来做到这一点吗?
    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多