【问题标题】:How to call model methods in controller in asp.net mvc如何在asp.net mvc的控制器中调用模型方法
【发布时间】:2013-12-11 08:46:02
【问题描述】:

我正在开发一个 asp.net mvc 应用程序。

这是我在整个应用程序中所遵循的方法。

这是我的模型:

 public class EmployeeModel

 {

   //Properties

   // Constructors

  // Methods
  }

我的视图:(使用模型属性强类型化)例如:一些编辑视图

我的控制者:

  [httppost]
       public void save(Employeemodel m) // ajax call that gets updated model details
    {
       m.update() // making database call from controller action
    }

我的 MVC 方法是否存在任何严重的设计问题。可能是我误解了 MVC?

在控制器动作中调用模型方法(m.update())是否合适?

模型包含操作数据的方法?对吗?

请帮助/建议在 MVC 中遵循的正确方法

【问题讨论】:

  • EmployeeModel里面写方法会调用...

标签: asp.net-mvc


【解决方案1】:

在一般实践中,您现在应该遵循此方法。 尽管这是接受整个模型作为参数的默认 MVC 行为,但您应该有一个称为 DTO(数据传输对象)或表示 UI 的 ViewModel 的中间层。 在接受并验证 View 模型后,您可以将其转换为您的主要业务实体。 Offcouse 它取决于您如何在更新方法中编写代码,但主要的黑客是这种情况是......任何主体都可以将任何已知的属性值传递给此方法并可以破解您的系统。例如,假设您的 Employeemodel 中有以下值 { ID, 姓名, 安全码, ... }

您的编辑屏幕只需输入名称即可对其进行更新。任何主体都可以为 SecurityCode 添加额外的 html,并且可以为其添加坏值 :) 我希望我没有让你感到困惑。 开始尝试实现 Repository 模式 MVC...谷歌它,你会发现它的基本用法。 :)

干杯

【讨论】:

【解决方案2】:

我建议您使用单独的层将数据保存到数据库中,因为它不仅仅是应该遵循的 MVC。

  1. 您应该使用 Model(仅具有功能)作为提供者,其职责是执行数据库任务。
  2. 保存实体的 ViewModel(仅限属性)
  3. 可以处理您的应用程序逻辑的控制器。
  4. 视图以呈现 HTML/UI。

因此,它与 MVC 无关,而是构建应用程序时应遵循的最佳实践。

此外,在规划应用程序架构之前,我们还必须考虑几个选项。

  1. 服务/业务层 - 交互黑白应用程序层和存储库
  2. Providers/Repository Layer - 交互 b/w 服务层和数据库

因此,这取决于您想要的抽象级别,但就 MVC 而言,我建议您对 ViewModel MVVM 进行额外的分离层。

最好在 stachexchange 聊天中问这些类型的问题。

示例

视图模型

public class User
{
  public Guid Id {get;set;}
  public string Name {get;set;}
}

型号

public class UserModel
{
  public void AddUser(User user)
  {
   //add to the database
  }

  public void UpdateUser(User user)
  {
   //update in the database
  }
}

控制器

[HttpPost]
public ActionResult UpdateUser(User user)
{
 UserModel user = new UserModel();
 user.UpdateUser(user);
}

【讨论】:

    【解决方案3】:

    你的逻辑很好。但正如KD所说,你应该有代表视图的视图模型。我建议您在视图模型中编写方法,因为您只会将模型实体传递给数据库或其他任何地方。

    public class Employee
    {
       //Properties
    }
    
    public class EmployeeViewmodel
    {
      // Employee model object
      //Constructors
      //Methods
    }
    
    return view("View name", EmployeeViewModel);
    

    因此您可以更新模型,通过 OR/M 将 Employee 单独传递给数据库。这是基本的灵活方法。您可以拥有一个实用模型类,其中包含常见的数据检索,如城市、州、性别......所以您不会将实体与其他模型混合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多