【问题标题】:Multiple views vs one "complex" view in MVCMVC 中的多个视图与一个“复杂”视图
【发布时间】:2010-11-29 18:46:06
【问题描述】:

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

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

想法、意见、见解?

【问题讨论】:

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


    【解决方案1】:

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

    Details
    
    Edit
    [HttpPost]
    Edit
    
    Create
    [HttpPost]
    Create
    

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

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

    或者让 Create 和 Edit 操作使用更安全的(防止 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; } }
    }
    

    然后对于编辑和创建,您可以创建创建和编辑可以共享的 EditorTemplate (Shared/EditorTemplates/ThingEditor.ascx)

    【讨论】:

    • 我同意,我认为您可以拆分的越多越好,并在可能的情况下重复使用和滥用,并将其包装成一个表格。好的好的,所以我没有离开基地?
    【解决方案2】:

    我认为您走在正确的轨道上...使用“主”视图进行布局,然后使用模板化助手进行“逻辑”。依靠 Html.DisplayFor(x=>x.Thing) 和 EditorFor

    您肯定不希望在两个地方进行布局。

    【讨论】:

    • 不知道为什么有人会否决这个...和我的想法一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2019-04-10
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多