2016-03-03 33 views
2

我正在創建我的第一個MVC項目,儘管不是編程新手。據微軟:MVC處理數據庫操作模型vs控制器類

一個MVC模型包含不包含在一個視圖或控制器的所有應用程序邏輯的。該模型應該包含您的所有應用程序業務邏輯,驗證邏輯和數據庫訪問邏輯。例如,如果您使用Microsoft Entity Framework來訪問數據庫,那麼您將在Models文件夾中創建實體框架類(您的.edmx文件)。 視圖應該只包含與生成用戶界面相關的邏輯。控制器應該只包含返回正確視圖或將用戶重定向到另一個操作(流量控制)所需的最少邏輯。其他一切都應該包含在模型中。一般來說,你應該爭取胖的模型和瘦的控制器。你的控制器方法應該只包含幾行代碼。如果控制器操作太胖,那麼您應該考慮將邏輯移出到Models文件夾中的新類。

起初我寫的所有數據庫邏輯控制器類。我已經成功地在模型類中重寫了它的大部分內容,但是這種方法存在一些主要問題,我希望得到澄清。

,首先是所有的UrlHelper/HttpRequestBase /的HttpContext/ModelStateDictionary,所有這些功能都是您控制器類的一部分。它被寫成好像你應該在控制器類中完成大部分的處理。

例如我的控制器類,一旦你註冊一個新的賬號:

而且我的模型類:

public bool register(RegisterViewModel model, UrlHelper url, HttpRequestBase request, ModelStateDictionary modelState) 
    { 
     if (userManager.FindByEmail(model.Email) != null) 
     { 
      modelState.AddModelError("Email", "Error, already have this email registered!"); 
      return false; 
     } 
     else 
     { 
      MyIdentityUser user = new MyIdentityUser(); 

      user.Email = model.Email; 
      user.FullName = model.FullName; 
      user.UserName = model.Email; 

      IdentityResult result = userManager.Create(user, model.Password); 

      if (result.Succeeded) 
      { 
       userManager.AddToRole(user.Id, "ReadOnly"); 

       string code = userManager.GenerateEmailConfirmationToken(user.Id); 
       var callbackUrl = url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: request.Url.Scheme); 
       userManager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking" + System.Environment.NewLine + "<a style=\"border:15px solid #00FF00;background-color:#00FF00;color:#000;font-size:14px; font-family:Arial;text-decoration:none\" href =\"" + callbackUrl + "\">here</a>"); 

       return true; 
      } 
      else 
      { 
       modelState.AddModelError("Email", "Error while creating the user!"); 
       return false; 
      } 
     } 
    } 

在這個模型類,我到ModelState中,UrlHelper進不去, HttpRequestBase,因爲它們都是控制器類的一部分。

我是否應該將所有這些變量傳入我的模型類以訪問它們?看起來像微軟寫這個來做控制器中的所有邏輯,即使他們不這樣做。只是不明白爲什麼不在控制器中這樣做,不必將所有這些變量傳遞給模型類。

+2

哦,沒有。我喜歡將它概念化的方式是我們有用於與數據庫進行通信的實體模型(通過實體框架)。這些是POCO類。控制器出去拿取我們的實體,我們填充ViewModel以滿足我們的特定需求(例如添加發票)。然後我們用ViewModel調用我們的視圖,當表單發回時我們驗證並保存。看到這個https://lostechies.com/jimmybogard/2009/04/24/how-we-do-mvc/ –

回答

0

在您給出的引用中,「模型」是指實體框架模型,即域邏輯。

查看模型應與顯示邏輯,例如有關在顯示它之前預處理從後端檢索的一些數據。將Register方法放在正確的地方是控制器或Controller調用的某些應用程序/域服務。

從創建Visual Studio中的模板創建一個新的MVC項目,並有一個看看的AccountController看到MS如何實現用戶註冊。

1

MVC與微軟無關 - 這是一個20年前的概念。認真。

是的,模型是 - 模型。很少有邏輯發生在他們(大多數:無),當我看到你的看法,我看到太多的代碼。這不是一個模型。

你必須模型中的所有這些變量不能訪問的原因是,你不需要他們。你不應該做任何不涉及在模型中呈現數據的處理。你做什麼。

+0

所以我應該在實際的控制器POST類中做這個邏輯?即使我創建一個服務類,它也會和這個模型類相似,因爲它不會成爲控制器的一部分,並且不能訪問這些變量。這就是我要做的...... 你的控制器方法應該只包含幾行代碼。如果控制器操作太胖,那麼您應該考慮將邏輯移出到Models文件夾中的新類。 – user1779362

+0

取決於你多久做一次 - 沒有人說控制器必須自己完成所有的工作。你也可以讓一個模型有子模型,並通過子視圖呈現(用於重複元素)或在這裏使用繼承。只要用盡可能少的邏輯來保持模型「愚蠢」。 – TomTom

0

該視圖用於「查看」結果...它告訴要從「控制器」顯示什麼,並且控制器獲取有關如何從模型構建數據的信息...

是這樣的...

首先,我們需要在模型中定義的表...

public partial class MyTable 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

讓您的數據,請在控制器中的任何修改......

public class MyController : Controller 
{ 
    MyEntities db = new MyEntities();   //Set the context for your DB 
    var dataToPassToView = db.MyTable.ToList(); //Get your data from the DB 

    //Make any changes/calculations to your data before passing it to the view... 

    return View(dataToPassToView);    //Return the View along with your data 
} 

和視圖...

@model IEnumerable<MyApp.Models.MyTable> //Tell the view what model to use 
///Some Code in here to display your data... 

正如你可以看到,該模型是唯一定義的數據結構。控制器在顯示數據之前「控制」數據......視圖從控制器獲取完成的產品,並根據指示顯示它。

相關問題