代码之家  ›  专栏  ›  技术社区  ›  Ryan Bolger

ASP.NET MVC的模型设计建议

  •  2
  • Ryan Bolger  · 技术社区  · 17 年前

    我目前正在将一些小型个人网站从WebForms转换为MVC。对于现有站点,数据库模式是可靠的,但我从未真正花时间构建适当的数据/业务模型/层。所有aspx页面都使用各种视图和存储过程直接与数据库通信,这些视图和存储过程是为方便起见而创建的。有了MVC,我现在正试图按照他们说的“做得对”,并使用LINQ到SQL和/或实体框架等工具为应用程序构建一个或多个合适的数据模型。

    我的问题围绕着构建数据模型的目标。我读过各种与模式相关的文章,我意识到最终答案可能取决于我的数据的特征。但一般来说,我是否应该尝试构建包含尽可能多的数据库的更大模型,以便只有一种方法可以与给定的一组表交互?或者我应该为每个MVC视图构建更小的定制模型,只包含视图所需的数据和访问权限吗?

    3 回复  |  直到 17 年前
        1
  •  2
  •   User    17 年前

    或者我应该为每个MVC视图构建更小的定制模型,只包含视图所需的数据和访问权限吗?

    这可能会更好。

    不要忘记,您可以将您的模型固定在层次结构中,这样每个模型中都可以存在诸如ID、名称和首选项之类的公共属性。

    Fat扩展模型更适合于企业应用程序,在企业应用程序中,框架会根据预加载的用户偏好、用户角色、访问权限等自动完成大量工作。对于小型个人项目,最好尽量保持模型的小型和干净。这也是一种保护。通过不将不必要的数据放入模型,您可以确保视图不会错误地显示错误的条目,或者提交表单不会错误地覆盖某些其他数据。

        2
  •  0
  •   Richard    17 年前

    我会选择表示当前系统中实际数据逻辑的模型,并让控制器返回视图需要的模型片段,例如:

    public ActionResult index()
    {
        var ListOfObjects = DataHelper.GetAll();
        ViewData.Add(ListOfObjects);
        return View();
    }
    
    public ActionResult ViewObject(int id)
    {
        var Object= DataHelper.GetObject();
        ViewData.Add(Object);
        return View();
    }
    
    public ActionResult ViewObjectChild(int Objectid, int ChildId)
    {
        var Child= DataHelper.GetChildObject(Objectid, ChildId);
        ViewData.Add(Child);
        return View();
    }
    

    论景观

    <%  var myListOfObjects = ViewData.Get<IList<Object>>(); %>
    

    /视图对象/1/

    <%  var myobject= ViewData.Get<Object>(); %>
    

    /ViewChild/1/1/

    <%  var myChild = ViewData.Get<Child>(); %>
    

        3
  •  0
  •   Steven Lyons    17 年前

    通常,您会有一个数据库的综合域模型。您可以使用(修改/添加/删除/等)服务层或控制器中的域模型(如果是小型应用程序)。

    但是,对于视图,可以使用表示对象使视图更易于维护。这些对象有时也称为DTO或视图模型对象。基本上,您要做的是创建一个对象,其中包含填充视图所需的模型中的所有数据。

    例如:

    public class Car() 
    {
      public string Model;
    }
    
    public class Driver()
    {
      public string Name;
    }
    

    您可以创建仅包含所需数据的对象,而不是将两个模型对象直接从控制器发送到视图:

    public class CarAndDriverViewModel()
    {
      public string CarMake;
      public string DriverName;
    }
    

    您将从域数据填充此对象,并将其传递给视图。这种观点是:

    model.DriverName + ": " + model.CarMake
    

    如果您想查看视图模型,可以使用一些项目和约定来帮助自动化视图模型的创建。 AutoMapper 这就是一个例子。

    推荐文章