Asp.net mvc 列出用于创建和编辑的属性和控制器操作

Asp.net mvc 列出用于创建和编辑的属性和控制器操作,asp.net-mvc,Asp.net Mvc,首先,请告诉我问题不清楚的地方,因为我不习惯在网上提问 简单地说就是问题: 该框架使得为具有简单标量属性的viewmodel创建编辑器变得非常容易。但是,当我们想要编辑包含其他对象列表的ViewModel时,它不能很好地缩放。框架不应假定会话的可用性 代码示例 我在这里发布了所有有意义的代码,这应该比用文字描述问题提供更好的上下文。我尽可能地简单: 名称空间简单{ 类SimpleController{ 公共Html CreateA(){ 返回视图(新的A()); } //这通常是一个http p

首先,请告诉我问题不清楚的地方,因为我不习惯在网上提问

简单地说就是问题
该框架使得为具有简单标量属性的viewmodel创建编辑器变得非常容易。但是,当我们想要编辑包含其他对象列表的ViewModel时,它不能很好地缩放。框架不应假定会话的可用性

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

名称空间简单{
类SimpleController{
公共Html CreateA(){
返回视图(新的A());
}
//这通常是一个http post,响应主窗体中显示的Bs列表下的按钮
[HttpPost]
公共Html CreateA(A,FormCollection集合){
//***这仅在列表的情况下才有必要***
//***在“更多涉案”案件中发生的是
//太可怕了。我没有发布任何尝试***
如果(集合[“按钮”]=“添加”){
a、 添加(新的B());
返回视图(a);
}
否则{
//将文件保存到数据库
//返回重定向到已创建对象的列表或详细信息
}
}
}
甲级{
公共字符串a1;
公共字符串a2;
公共字符串a3;
公开名单b;
}
B类{
公共字符串b1;
公共字符串b2;
}
}
涉及的名称空间{
甲级{
公共字符串a1;
公共字符串a2;
公共字符串a3;
公开名单b;
}
B类{
公共字符串b1;
公共字符串b2;
公开名单c;
}
C类{
公共字符串c1;
公共字符串c2;
}
}
对于这个简单的案例,这些视图没有包含在代码中,但它已经过测试,运行良好。为此,我使用了表达式树以使其更简单,但代码中没有发布这一点。然而,在更复杂的情况下,我还没有完成,我还没有想到一个简单的解决方案,除了思考奇怪和奇怪的

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

它显示了两个案例,其中一个我已经测试过运行良好。一定要假设所使用的视图返回的html一旦发布就会绑定回深层对象

问题
请注意,在代码中,当我们遇到更复杂的情况时,程序员会立即被一个新对象如何在处理二级子对象时插入的问题所困扰。具体地说,我不希望有一个if条件来将
C
添加到
a
的控制器内的特定
B
。如果
List
存在于另一个父项下,比如说
D
,那么我必须编写相同的代码,这很烦人

控制模型是否完全从MVC中删除,这是否意味着有些事情非常难做?
我相信我是在玩弄对用户控件的需求,以及一些创建可重用控件的方法,这样我就可以拥有一个用于
B
及其子对象(
C
)的控制器,然后在实现
a
的CRUD接口时重用所有这些

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


最后一点:我之所以这么麻烦,是因为我想看看我能在多大程度上推动无状态化,保持代码干净,并且在MVC模式的限制范围内。我希望有更多模式失败的地方的例子,而不是所有关于模式的营销材料。这样,我们可以立即发现在哪里不使用某些面向模式的产品。我相信,普通的ASP.NET会轻松地使用它的viewstate和事件流模型来处理我的问题。

我不完全清楚你的意思,但我觉得你需要ViewModels。更准确地说,是从彼此继承的视图模型。你不想一遍又一遍地写同样的代码(干巴巴的),所以你应该为你的ViewModels设计一个类模型,其中最普通的类位于顶部(即,保存你网站几乎每个页面上需要的数据),而更特定于页面的类位于底部。更多特定于页面的类继承自更一般的类

但是,如果需要频繁构建某些数据,也可以向ViewModels添加方法。例如,如果需要使用
选项
选择
框中的项目构建一个
SortedDictionary
,则可以在适当级别将该方法添加到类中。或者,您可以让该类始终通过构造函数来构建它


希望这有帮助……

是因为这个问题不可理解,还是因为没有答案,所以我没有得到回答?现实生活中的例子会更好,而不是A、B、C类的A、B、C属性。@LukLed:你可以用organiz替换A
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;
    }
}