ASP.NET MVC的模式查看隐藏/取消隐藏控件

时间:2011-07-05 10:52:10

标签: .net asp.net-mvc

我正在寻找POEAA

我有一个标准的ASP.NET MVC View,有大量的输入控件。根据来自2个主要下拉控件的输入触发控件的可见性。例如值为A的DropDown1和值为B的DropDown2将仅显示完整列表中的少数控件,并且还将更改强制要求。

我应该如何设计视图?

  1. 根据DropDown组合编写java脚本并隐藏/取消隐藏。可以有30种组合,因此管理新控件和组合可能具有挑战性

  2. 在数据库中创建一个表,该表将为每个组合提供一个控件ID列表,然后在客户端循环通过它来隐藏/取消隐藏?

  3. 有人可以建议的其他模式吗?目标是保持清洁和易于管理

  4. 真实世界示例

    处理房产列表表单。根据选定的属性类型和转换类型,隐藏/显示控件。

    例如卧室和浴室不适用于地块/土地。有二十几个这样的控件,其可见性需要根据属性类型/事务类型组合进行管理。

    列表可以增长......

    谢谢, Pinakin

3 个答案:

答案 0 :(得分:3)

我建议通过实现MVVM模式来寻找更具反应性的方法,并建议将knockout.js视为将模型绑定到控件及其属性的方法,以便更改模型将产生超出价值正在改变。

希望这会给你一些关于如何前进的想法,但我支持我的原始评论,期待重新评估你如何呈现用户界面。单个视图上的30个控件太多了。把它分解成更小的块,如果你很难管理那么它对用户来说也很难。

答案 1 :(得分:2)

对于基于Web的应用程序,您应该寻求尽可能将任何复杂的输入屏幕分解为最不复杂的视图,主要是从用户的角度来看。

例如,不要修改一个整体选项页面,而是让下拉组合将浏览器指向特定于该组合的页面/视图。

您将获得许多特定页面/视图,但您将获得许多优势:

  1. 用户未看到 从根本上改变可能的网页 混淆他们

  2. 较不复杂的页面会导致较低的页面 部分问题的机会 页面加载

  3. 您的网页/视图已封装:您 知道任何变化只会影响 那个组合

  4. 可以通过使用包含/用户控件和公共代码块来最小化重复,以使代码尽可能保持干净。

答案 2 :(得分:1)

如何使用属性类型和事务类型作为操作方法参数,然后根据这些参数显示不同的视图?然后,您可以根据上下文将生成的表单发回到不同的操作,这将使验证变得容易。我认为这是一种非常易于维护的方法。 (当然,您仍然可以添加UX改进,例如通过AJAX加载视图而不是完全重定向。)

您可以为不同方案的视图模型使用公共基类,并使用EditorForModel帮助程序为每个派生类型显示正确的表单。

public abstract class PropertyViewModelBase { ... }
public class ApartmentForRentViewModel : PropertyViewModelBase { ... }
public class LandForSaleViewModel : PropertyViewModelBase { ... }

然后在你的控制器中:

[HttpGet]
public ActionResult AddProperty(int propertyType, int transactionType) 
{
    PropertyViewModelBase viewModel = // Perhaps a factory that returns an
                                      // empty instance of the proper type?

    return View(viewModel);
}

(强类型)视图中的某处:

@model MyApp.Models.PropertyViewModelBase

[...]

@Html.EditorForModel()

您必须为每个派生类型PropertyViewModel定义一个编辑器模板(部分视图)。如果您希望根据属性类型+事务类型将表单发布到不同的操作方法,请在编辑器模板中包含整个HTML表单。

这是一种可能的方法,有利于将单一的,巨大的形式转变为几个更小,更专业的形式。