2017-03-08 32 views
0

我正在一個網站上工作,員工有一個Gmail或雅虎的電子郵件,這決定了他們得到的手機的類型。如果他們進入Gmail賬戶,某些類型的電話(iPhone,Galaxy,Samsung等)應該出現在下拉列表中。同樣應該爲雅虎帳戶工作。 Gmail帳戶的電話類型多於雅虎帳戶。我拿到了文本框並下拉框工作。不過,我需要幫助編寫一個函數來說明gmail或yahoo之間的區別,以確定在用戶輸入電子郵件域時顯示哪些類型的電話。不知道是否需要執行switch語句或正則表達式匹配。如何在用戶輸入電子郵件時驗證電子郵件域名地址以顯示某些項目以顯示在下拉列表菜單中?

控制器代碼如下:

[Display(Name = "Email Address")] 
[RegularExpression(@"^([a-zA-Z0-9._%+-]{1,50})+(@gmail|@GMAIL|@YAHOO|@yahoo)+(\.)+(com|COM)$", 
     ErrorMessage = "Invalid Email Format. Use: [email protected] or [email protected]")] 

[Required(ErrorMessage="Please input gmail or yahoo")] 
public string Email { get; set; } 

視圖代碼如下:從用戶輸入

<div class="col-lg-2 col-md-3 col-sm-3"> 
    @Html.EditorFor(model => model.Email, 
      new { htmlAttributes = 
       new { 
         @class = "form-control", 
         @placeholder = "[email protected] or [email protected]", 
         data_bind = "value: Request.Email", 
         data_toggle = "tooltip", 
         data_placement = "top", 
         title = "Requestor's Email" } 
    }) 

    @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" }) 
</div> 

dropdowncascade.js //獲取信息

$(document).ready(function() { 
$("#Carriers").change(function() { 
    var carrierId = $(this).val(); 
    var emailAddress = $("#Email").val(); 
    $.getJSON("../Home/LoadPhonesByCarrierId", { carrierid: carrierId, emailaddress: emailAddress }, //reads what carrier id and the email from the user input 
      function (phonesData, accsData) { 
       var select = $("#Phones"); 
       select.empty(); 
       select.append($('<option/>', { 
        value: 0, 
        text: "Select a Phone" 
       })); 
       $.each(phonesData, function (index, itemData) { 
        select.append($('<option/>', { 
         value: itemData.Value, 
         text: itemData.Text 
        })); 
       }); 
      }); 
}); 

幫助與HomeControllers功能的.cs! //需要匹配電子郵件域以確定在下拉列表中顯示哪些電話類型。

  public JsonResult LoadPhonesByCarrierId(string carrierid, string email) 
    { 
     // string Email = txt.Text; 
     //The email difference swicth statement 
     //if(Regex.IsMatch(Email, @"^([a-zA-Z0-9._%+-]{1,50})(@gmail|@GMAIL)(\.)(com|COM)$")) 
     string pattern = @"^([a-zA-Z0-9._%+-]{1,50})(@gmail|@GMAIL)(\.)(com|COM)$"; 
     string input = "[email protected]"; 
     Match match = Regex.Match(input, pattern); 
      if (match.Success) 
     { 
      var com = from c in db.Phones 
         where c.CommerceAllowed == true 
         select c; 

     } 
      else 
     { 
      var gov = from g in db.Phones 
         where g.GovAllowed == true 
          select g; 
     } 

     var phonesList = this.GetPhones(Convert.ToInt32(carrierid)); 
     var phonesData = phonesList.Select(m => new SelectListItem() 
     { 
      Text = m.Name, 
      Value = m.PhoneID.ToString(), 
     }); 
     return Json(phonesData, JsonRequestBehavior.AllowGet); 
    } 

回答

0
 public JsonResult LoadPhonesByCarrierId(string carrierid, string emailaddress) 
     { 
     string pattern = @"^([a-zA-Z0-9._%+-]{1,50})(@gmail|GMAIL)(\.)(com|COM)$"; 
     Match match = Regex.Match(emailaddress, pattern);//checks the email address from user and pattern. 
     if (match.Success)//if true it will do the following 
     { 
         var gov = from g in db.Phones 
         where g.GovAllowed == true 
         select g; 
     } 
     else 
     { 
         var com = from c in db.Phones 
         where c.CommerceAllowed == true 
         select c; 
     } 


    var phonesList = this.GetPhones(Convert.ToInt32(carrierid)); 
    var phonesData = phonesList.Select(m => new SelectListItem() 
    { 
     Text = m.Name, 
     Value = m.PhoneID.ToString(), 
    }); 
    return Json(phonesData, JsonRequestBehavior.AllowGet); 
} 
1

我真的不明白什麼是這裏的關鍵點。首先,假設與e-Mail模式已被選中,所以要檢查的唯一事情是域。一個非常可靠的方法是檢查你將存儲在數據庫/數據庫上下文中的域列表。

如果你想要一個簡單,快速和骯髒的解決方案,創建兩個列表,並檢查它們。

var eMailProviders = new Dictionary<int, string[]>(); 

    eMailProviders.Add(1, new []{ "gmail.com", "googlemail.com" }); 
    eMailProviders.Add(2, new []{ "yahoo.com", "yahoomail.com" }); // I don't know the domains... 

    var email = "[email protected]"; 

    var providerId = eMailProviders 
     .Where(x => x.Value.Any(domain => email.EndsWith(domain))) 
     .Select(x => x.Key) 
     .FirstOrDefault(); 

    Console.WriteLine(providerId); 

Fiddle

還是因爲我得到的問題,錯了嗎?當然,這是一個硬編碼的解決方案,但是你得到了Idea,這可以傳送到你的數據庫。此外,你可以嘗試做出正則表達式的決定,但爲什麼要麻煩?很容易就搞亂了正則表達式,很難反映所有的域選項。

+0

我沒有電子郵件數據庫。我需要弄清楚如何在switch語句或if-else語句中編寫正則表達式。如果這在正則表達式中甚至是可能的。在控制器視圖中,我使用正則表達式來確定它是否是有效的電子郵件地址。因此,在homecontrollers.cs文件中,我需要它來檢查它是否是yahoo或gmail域,它將轉到數據庫並收集要顯示的電話類型。 – Sandy2016

+1

@ Sandy25:你錯過了這個答案的要點。這將是使用'[RegularExpression]'屬性的替代方法。無論如何,這是對屬性的不好使用。它旨在驗證一般格式,而不是內容。無論如何,通過這裏的答案,您可以輕鬆驗證地址是否以有效域的可配置列表結尾(以防您需要稍後添加更多內容)。然後您只需通過'ModelState.AddModelError(「Email」,「無效的電子郵件提供商。」)手動將錯誤添加到'ModelState'。 –

+0

你甚至可以通過創建一個自定義驗證屬性來提供這個驗證。 –

相關問題