2010-02-24 314 views
1

在Web表單中,我使用MailDefinition類來發送電子郵件模板。我怎樣才能做到這一點與MVC?如何在MVC中發送電子郵件地址驗證電子郵件?

[HttpPost] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Attempt to register the user 
      MembershipCreateStatus createStatus = 
       MembershipService.CreateUser(model.UserName, model.Password, model.Email); 

      if (createStatus == MembershipCreateStatus.Success) 
      { 
       // TODO: Send email verification code go here? 

       //FormsService.SignIn(model.UserName, false /* createPersistentCookie */); 
       return RedirectToAction("Index", "Home"); 
      } 
      else 
       ModelState.AddModelError("", ErrorCodeToString(createStatus));     
     } 
     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

我正在尋找一種符合MVC設計模式的解決方案,不知道如何去做。

回答

1

國際海事組織,要做到這一點的最好辦法是通過組成來解決,而不是繼承。

我通常有一個INotifier接口,我使用的接口有一個Notify方法,它接受用戶,標題和正文。然後我可以手動將該INotfier設置爲我的EmailNotifier實現,或者通過構造函數或IoC容器傳遞它。

在任何情況下,我的EmailNotifier實現會從正文中提取用戶的電子郵件,並使用System.Net.Mail命名空間郵件對象發送電子郵件。這有另外的好處,即System.Net.Mail已經爲你解決了如何從你的配置文件中獲取所有的電子郵件設置,所以你有一個地方可以設置/更新設置。

我通常也有一個NullNotifier實現INotifier,但什麼都不做,所以我的控制器可以安全地調用notifier.Notify(用戶,標題,正文)而不用擔心NRE的問題。

這裏的一對System.Net.Mail更多的信息:http://www.systemnetmail.com/

+0

保羅,感謝您的答覆。我對MVC非常陌生,以至於你提到的大部分內容都是由我自己決定的。我正在研究開源代碼(SutekiShop)來確定在MVC中實現事物的正確方式。你認爲你可以在Suteki店找到你所提到的嗎?查看代碼對我來說更容易遵循和理解。 – Picflight 2010-02-24 18:23:32

+0

從來沒有聽說過SutekiShop,對不起。 我在說的不是MVC特有的,它只是常規的OOP +控制反轉。 – Paul 2010-02-24 18:33:45

1

我創建了一個基本控制器,它具有可以在繼承控制器上重寫的虛擬方法sendEmail(MyBaseViewModel模型),但具有查找視圖模型中的電子郵件,發件人和主題的邏輯,並且如果發現將發送郵件布爾值爲true,並在viewmodel中查找AlternateEmailView字符串。

然後,我有一個自定義的查看結果,查找sendMail屬性的真實性,然後實際呈現視圖(或備用視圖)併發送電子郵件,然後將正常視圖呈現給瀏覽器。似乎工作很好,並允許我將我的電子郵件內容視爲維護的另一個視圖。

我應該補充一點,我在視圖名稱中也有一個約定,這樣如果我不提供AlternateEmailView屬性,它將查找ViewName_Email,如果找不到則發送普通視圖。

哈爾