2011-07-05 252 views
0

我要寻找一个POEAA模式的ASP.NET MVC视图中隐藏/取消隐藏控件

我有吨输入控件的标准ASP.NET MVC视图。控件的可见性根据2个主下拉控件的输入触发。例如,具有值A的DropDown1和具有值B的DropDown2将仅显示完整列表中的几个控件,并且还将更改强制性要求。

我应该如何设计视图?

  1. 编写Java脚本和隐藏/取消隐藏基于下拉combinations.There可以30名这样的组合可能是难以管理的新控件和组合

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

  3. 有人可以提出任何其他模式?目的是为了保持它的清洁和管理

真实的例子

一个楼盘,表格上工作。根据选定的属性类型和转换类型,控件被隐藏/显示。

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

列表也会增长...

感谢, Pinakin

+0

怎么样,重新设计你的系统,使你没有这个问题?任何时候编码变得非常困难都是一个很好的迹象表明你错误地接近了它。 – Lazarus

+1

+1只是为了平衡downvotes - 我不认为这是一个坏问题。 –

+0

谢谢拉撒路。我仍在设计这个系统。试图找到处理这种情况的好模式。我不确定为什么它被称为HOMEWORK问题。 –

回答

3

我建议通过实施MVVM模式寻找一个更为被动的方法和建议看着knockout.js作为结合模型的方法到你的控件和它们的属性,这样改变你的模型将会产生超出被改变的值的效果。

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

+0

所有30个控件一次不可见。该组合触发可见性。 –

+0

我意识到你想要选择性地显示和隐藏控件,但从描述中看,所有30个都出现在视图中,这太多了。任何时候当你看到许多需要完成的选项时,试着通过它们寻找一个路径,让你可以在逻辑组中显示选项的子集,以便用户可以完成子集并移动到下一个,下一个组是根据先前的一组响应来选择。这是一个经典的“向导”方法。 – Lazarus

+0

完全同意。该视图只是制作单个属性条目所需的全部信息的子集。有一个地图选择,图片上传,客户端信息等。我打算使用向导方法,以方便用户。也许可以将基本信息分成向导步骤。 –

2

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

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

你最终会与一些特定页面/视图,但你留下了许多优点:

  1. 用户没有提出一个 根本上改变了网页,可以 混淆

  2. 一个不太复杂的页面导致较低 机会问题,是由于部分 页面加载

  3. 个您的网页/视图封装:你 知道的任何更改将只影响 康宝

重复可以通过使用最小化的包括/用户控件和通用代码块,以保持你的代码干成可能。

1

如何使用属性类型和事务类型作为操作方法参数,然后基于这些参数显示不同的视图?然后,您可以根据上下文将结果表单发回不同的操作,这将使验证变得容易。我认为这是一个可维护的方法。 (当然,您仍然可以添加用户体验改进,例如通过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表单包含在编辑器模板中。

这就是一个可能的方法,将单片巨大的形式变成几个更小,更专业的形式。

+0

谢谢安德斯。不错的选择 –