asp.net-mvc - 列出用于创建和编辑的属性和 Controller 操作

标签 asp.net-mvc

首先,请帮助我指出问题不清楚的地方,因为我不习惯在互联网上提问。

问题简述:
该框架使得为具有简单标量属性的 View 模型创建编辑器变得非常容易。然而,当我们想要编辑包含其他对象列表的 View 模型时,它的扩展性并不好。该框架不应假定 session 的可用性,既不是 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;
    }
}

View 未包含在简单案例的代码中,但它已经过测试并且运行良好。我为此使用了表达式树以使其更容易,但这并没有发布在代码中。然而,在更复杂的情况下,我还没有完成,除了琢磨那些离奇古怪的事情,我还没有想出一个简单的解决办法

在上面的代码中,简单的案例如我所料地工作。我可以添加 BA不使用任何 session 或 Javascript。但是我不得不在 Controller 的 CreateA() 中添加一个子路由检查我何时实际按下了添加按钮。 在更复杂的情况下,甚至需要对 Controller 进行更多更改。子路径必须决定使用哪个 B一个新的C需要添加到。

它显示了两种情况,其中一种我已经测试过,效果很好。请假设所使用的 View 返回 html,一旦发布就会绑定(bind)回深层对象。

问题
请注意,在代码中,一旦我们处于更复杂的情况下,程序员会立即被处理二级子对象时应如何插入新对象所困扰。 特别是,我不想使用 if 条件来添加 C进入特定的BA 的 Controller 内.如果 List<B> 我必须编写相同的代码,这很烦人存在于另一个 parent 之下,比如说D .

控制模型是否完全从MVC中抹去,这是否意味着有些事情很难做?
我相信我正在考虑对用户控件的需求和一些创建可重用控件的方法,这样我就可以拥有一个 Controller B及其子项( C 的)然后在为 A 实现 CRUD 接口(interface)时重用所有这些.

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

最后的说明:我遇到所有麻烦的原因是我试图了解我可以在多大程度上插入无状态并保持代码干净并在 MVC 模式的限制内。我希望有更多模式失败的地方的例子,而不是所有关于模式的营销之类的 Material 。这样我们就可以立即发现哪些地方和哪些地方不使用某些面向模式的产品。我相信,常规的 ASP.NET 会使用其 View 状态和事件流模型轻而易举地处理我的案例。

最佳答案

不太确定我理解您的意思,但我觉得您需要 ViewModel。更准确地说,是相互继承的 ViewModel。您不想一遍又一遍地编写相同的代码(DRY),因此您应该为您的 ViewModel 设计一个类模型,其中最通用的类​​位于顶部(即,在您网站的几乎每个页面上保存您需要的数据) 和底部的更多页面特定类。更多的页面特定类继承自更通用的类。

但是如果您需要经常构建某些数据,您也可以向 ViewModel 添加方法。例如,如果您需要为 select 框构建一个带有 option 项的 SortedDictionary,您可以为该类添加一个方法,位于适当的水平。或者您可以让该类始终通过构造函数来构建它。

希望这有助于...

关于asp.net-mvc - 列出用于创建和编辑的属性和 Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4980570/

相关文章:

asp.net-mvc - ASP.NET MVC 定位从 cshtml 生成的 cs 文件?

c# - 以编程方式将 x509 证书上传到 azure 应用程序 list

c# - Twitter Bootstrap 字形图标不会出现在 Release模式 404 中

c# - 在 Asp.net Mvc 5 应用程序中将用户分配给项目列表

c# - 如何解析出 MS Word 格式?

asp.net-mvc - 将 Ninject 更改为 Asp MVC 的 Autofac 等效项

jquery - MVC 3 jquery renderbody <=> 标题(_layout)

asp.net-mvc - 安装 Microsoft.ReportingServices.ReportViewerControl.WebForms 后程序集冲突

asp.net-mvc - 在子级 `get` 操作后返回右父级的 `post`

asp.net-mvc - 将变量传递给 Ajax.ActionLink OnSuccess、OnComplete、OnFailure 等