我正在創建我的第一個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,因爲它們都是控制器類的一部分。
我是否應該將所有這些變量傳入我的模型類以訪問它們?看起來像微軟寫這個來做控制器中的所有邏輯,即使他們不這樣做。只是不明白爲什麼不在控制器中這樣做,不必將所有這些變量傳遞給模型類。
哦,沒有。我喜歡將它概念化的方式是我們有用於與數據庫進行通信的實體模型(通過實體框架)。這些是POCO類。控制器出去拿取我們的實體,我們填充ViewModel以滿足我們的特定需求(例如添加發票)。然後我們用ViewModel調用我們的視圖,當表單發回時我們驗證並保存。看到這個https://lostechies.com/jimmybogard/2009/04/24/how-we-do-mvc/ –