多个视图与MVC中的一个“复杂”视图

时间:2010-11-29 18:46:07

标签: asp.net-mvc design-patterns dry single-responsibility-principle

这是在我们的一次回顾中提出的,并希望获得一些额外的反馈和抽查。我们目前有许多基于布尔标志启用/禁用的视图(Model.IsNew是一个例子)。我认为视图应该尽可能简单,控制器应该确定该视图的数据,而不一定是它的工作原理。我认为部分或全部的观点应该是 - 应该做什么和处理与确定应该显示/隐藏的内容的视图。一个非常基本的例子如下,但涵盖了这两方面,并且主要反映了我们所拥有的......

控制器有一对名为Details的方法(post / get)。 [Get] Details有一个参数,Id和[Post] Details接受id和viewmodel。在帖子中,该方法长约30行,检查有效模型,确定其是否为新,如果某个值发生了变化(触发重定向)等等(我认为这是不正确的)。 [Get] Details检查空id,填充必要的下拉菜单,没什么花哨的(我认为这是对的)。详细视图本身包含一小部分逻辑:If(!Model.IsNew){RenderAction(History => History.Show(id);}(我认为这在if中是不正确的,Show应该知道要显示什么,不管它是否是新的)。加上这个是所述详细信息视图的布局没有完成两次。详细信息/添加几乎相同,减去一些禁用字段取决于状态(可能这些应该是部分?) - 可以禁用/删除实体,使值可编辑或不可用。

思想,观点,见解?

2 个答案:

答案 0 :(得分:5)

为什么不创建多个视图和操作?

Details

Edit
[HttpPost]
Edit

Create
[HttpPost]
Create

然后他们可以共享一个Model对象

public ThingModel
{
    public Thing Thing { get; set; }
}

或让“创建”和“编辑”操作使用更安全(防止html注入)模型,该模型还允许您使用内置的验证选项。

public ThingEditorModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    public bool IsNew { get { return Id == 0; } }
}

然后对于编辑和创建,您可以创建一个CreateTemplate(Shared / EditorTemplates / ThingEditor.ascx),Create和Edit可以共享

答案 1 :(得分:0)

我认为你走在正确的轨道上......使用'main'视图进行布局,然后使用Templated Helpers作为'逻辑'。精益于Html.DisplayFor(x => x.Thing)和EditorFor

你绝对不希望布局在两个地方。