2015-02-10 41 views
0

使用實體框架時,我無法驗證在我的MVC頁面上工作。如果有人能指出我做錯了什麼,我將不勝感激。它肯定是看到元數據,因爲標籤正在工作。但是,當我點擊提交時,它會繼續到下一頁。這可能與我在視圖模型中有一個類的實例有關嗎?使用實體框架進行MVC驗證

元數據類

[MetadataType(typeof(CompanyMetaData))] 
public partial class Company 
{ 
} 

[MetadataType(typeof(CompanyUserMetaData))] 
public partial class CompanyUser 
{ 
} 

public class CompanyMetaData 
{ 
    [Required(ErrorMessage = "Company Name is required")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Service Center is required")] 
    public string ServiceCenterCode { get; set; } 

    [Required(ErrorMessage = "Account Number is required")] 
    public string AccountNumber { get; set; } 

    [Required(ErrorMessage = "Edition is required")] 
    public string Edition { get; set; } 
} 

public class CompanyUserMetaData 
{ 
    [Required] 
    [RegularExpression(@"^\[email protected][a-zA-Z_]+?\.[a-zA-Z]{2,3}$", ErrorMessage = "Invalid Email Address")] 
    public string EmailAddress { get; set; } 

    [Required(ErrorMessage = "Password is required")] 
    public string Password { get; set; } 

    [Required(ErrorMessage = "First Name is required")] 
    public string FirstName { get; set; } 

    [DisplayName("Last Name")] 
    [Required(ErrorMessage = "Last Name is required")] 
    public string LastName { get; set; } 
} 

視圖模型

public class CreateCompanyViewModel : ILayoutAwareViewModel 
{ 
    public List<AdvisorServiceCenterVW> ServiceCenters { get; set; } 
    public LayoutViewModel LayoutViewModel { get; set; } 
    public Company newCompany { get; set; } 
    public CompanyUser newUser { get; set; } 
    public List<FuneralHome> newFuneralHomes { get; set; } 
} 

標記樣品

<div class="form-group"> 
    <label>@Html.LabelFor(d=>d.newUser.LastName)</label> 
    <div class="controls"> 
     @Html.TextBoxFor(d => d.newUser.LastName, new { @class = "form-control" }) 
     @Html.ValidationMessageFor(d => d.newUser.LastName) 
    </div> 
</div> 

控制器

public ActionResult CreateCompanyLocations(CreateCompanyViewModel incomingModel) 
    { 
     var model = (CreateCompanyViewModel)TempData["model"]; 

     LayoutViewModel lvm = _layoutHelper.GetLayoutViewModelData("Configure New Company"); 
     model.LayoutViewModel = lvm; 

     model.newCompany = incomingModel.newCompany; 
     model.newUser = incomingModel.newUser; 

     var fhs = _siteService.GetCustomerLocations(model.newCompany.AccountNumber); 
     model.newFuneralHomes = new List<FuneralHome>(); 
     foreach (var fh in fhs) 
     { 
      model.newFuneralHomes.Add(new FuneralHome() 
      { 
       Address = fh.Address, 
       Name = fh.CustomerName, 
       City = fh.City, 
       AccountNumber = fh.AccountNumber, 
       ServiceCenterCode = fh.ServiceCenterCode, 
       State = fh.State, 
       ZipCode = fh.ZipCode, 
       Phone = fh.Phone, 
       ContactName = fh.ContactName 
      }); 
     } 

     TempData["model"] = model; 

     return View(model); 
    } 
+0

發佈相關控制器代碼。 – 2015-02-10 15:20:30

+0

@CraigW。更新 – 2015-02-10 15:24:52

回答

1

您需要檢查您的控制器代碼中的ModelState.IsValid並相應地進行分支。目前您的控制器正在處理模型,無論它是否有效。典型的模式看起來像這樣:

if(ModelState.IsValid) 
{ 
    // Do stuff for when model is valid 
} 
else 
{ 
    // return the view with the invalid model to give the user 
    // a chance to fix it 
    return View(model); 
} 
+0

因此它不像Web窗體中的RequiredFieldValidators那樣工作?該頁面必須發佈才能使驗證生效? – 2015-02-10 15:54:53

+0

有一些客戶端驗證可以發生,如果您已啓用該功能,但底線是,如果頁面發佈,您仍然需要檢查您是否擁有有效的模型。 – 2015-02-10 15:56:57

+0

我可以問爲什麼這被接受,然後不被接受? – 2015-02-12 00:36:09

0

它結束了與上述答案無關。我錯過了我的佈局頁面上的jquery驗證和jquery不顯眼的腳本,這是導致驗證不被觸發的原因。您無需在控制器中執行任何操作即可正常工作。

+0

直到您添加客戶端無法完成的驗證(例如自定義驗證器),或者您遇到JavaScript關閉的客戶端。當你使用數據註釋時,你應該總是在防守上編碼你的控制器,這意味着使用我發佈的模式。 – 2015-02-16 16:07:21