2015-02-10 42 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