列表用于创建和编辑的属性和控制器操作

时间:2011-02-12 20:54:30

标签: asp.net-mvc

首先,请告诉我这个问题不明确的地方帮助我,因为我不习惯在互联网上提问。

坚果壳中的问题
该框架使得为具有简单标量属性的视图模型创建编辑器变得非常容易。但是,当我们想要编辑包含其他对象列表的视图模型时,它不能很好地扩展。框架不应假设会话的可用性,也不应该是javascript。

代码示例
我在这里发布了所有有意义的代码,这应该比描述单词的问题提供更好的上下文。 我保持尽可能简单

namespace Simple{
    class SimpleController{
        public Html CreateA(){
            return View(new A());
        }

        // this is usually an http post responding to a button under the displayed listing of Bs in the main form
        [HttpPost]
        public Html CreateA(A a, FormCollection collection){
            // ***  This is only necessary in the case of lists ***
            // ***  what happens in the "MoreInvolved" case is
            //     terrifying. I didn't post any attempt. ***
            if(collection["button"] == "AddB"){
                a.listB.Add(new B());
                return View(a);
            }
            else{
                // save a to database
                // return redirect either to list or to details of created object
            }
        }
    }

    class A {
        public string a1;
        public string a2;
        public string a3;
        public List<B> listB;
    }

    class B {
        public string b1;
        public string b2;
    }
}

namespace MoreInvolved {
    class A {
        public string a1;
        public string a2;
        public string a3;
        public List<B> listB;
    }

    class B {
        public string b1;
        public string b2;
        public List<C> listC;
    }

    class C {
        public string c1;
        public string c2;
    }
}

视图不包含在简单案例的代码中,但它已经过测试,效果很好。我使用表达式树来使它更容易,但是没有在代码中发布。然而,在更复杂的情况下,我还没有完成,除了思考奇怪和奇怪之外,我还没有想到一个简单的解决方案

在上面的代码中,简单的案例正如我所期望的那样工作。我可以在不使用任何会话或Javascript的情况下将B添加到A。但是我必须在控制器的CreateA()中添加一个子路由来检查我何时按下了添加按钮。 在更复杂的情况下,需要对控制器进行更多更改。子路由必须决定哪个B需要添加新的C

它显示了两个案例,其中一个我已经测试过,效果很好。假设使用的视图返回一旦发布后绑定回深层对象的html。

问题
请注意,在代码中,一旦我们处理更复杂的情况,程序员会立即踩到在处理二级子项时应该如何插入新对象。 具体,我不希望if条件将C添加到B控制器内的特定A。如果List<B>存在于另一个父级下,D,我必须编写相同的代码,这很烦人。

控制模型是否完全从MVC中删除,这是否意味着某些事情难以做到?
我相信我正在调整对用户控件的需求以及创建可重用控件的某种方式,以便我可以为B及其子项(C)设置一个控制器,然后重用所有这些为A实现CRUD接口时。

为标量类型创建编辑器的难易程度,或者一方面由标量类型组成的对象与另一方面的对象列表的编辑器之间存在不平衡 真正的问题是,标量类型有自动编辑器,但没有列表中的标量类型。我提出的解决方案是多余的,并引入看似不必要的额外代码和头痛。

最终注释:我遇到麻烦的原因是我试图看到我能在多大程度上推动无状态并保持代码清洁并且在MVC模式的限制范围内。我希望有更多的模式失败的地方的例子,而不是像模式的所有营销。这样我们就可以立即发现不使用某些面向图案的产品的地点和地点。我相信,常规ASP.NET将使用其viewstate和事件流模型轻松处理我的案例。

1 个答案:

答案 0 :(得分:0)

我不完全确定我明白你的意思,但我觉得你需要ViewModels。更确切地说,ViewModel相互继承。您不希望一遍又一遍地编写相同的代码(DRY),因此您应该为ViewModel设计一个类模型,其中最常见的类位于顶部(即,几乎每个页面上都需要保存数据) )以及底部更多页面特定的类。特定于页面的类继承自更通用的类。

但是,如果您需要经常构建某些数据,还可以向ViewModel添加方法。例如,如果您需要使用SortedDictionary框的option项构建select,则可以在适当级别为类添加方法。或者你可以让这个类总是通过构造函数来构建它。

希望这会有所帮助......