2012-02-19 130 views
1

我在ASP.NET MVC3模型中有一個員工類。有一個名爲「EmpName」的字段。創建員工記錄有一個創建操作。應該有一個服務器端驗證 - 名稱的第二個字母應該是「E」,名稱的第三個字母應該是「F」。 (沒有客戶端驗證)。如果驗證失敗,則該消息應作爲驗證摘要顯示在創建視圖中。我們如何做到這一點?ASP.NET MVC3:創建操作的驗證摘要(服務器端驗證)

注意:這兩個驗證的驗證錯誤預計會出現兩個錯誤結果(兩個不同的行)。

注意:我沒有使用實體框架

以下是視圖代碼。

@model MyApp.Employee 
@{ ViewBag.Title = "Create"; } 
<h2>Create</h2>  
@using (Html.BeginForm()) 
{  
    <div >   EmpName :~: @Html.EditorFor(model => model.EmpName) </div>  

CONTROLLER

// GET:  
public ActionResult Create()  
{      
    return View();  
} 

// POST: 
[HttpPost]  
public ActionResult Create(Employee emp)  
{   
if (ModelState.IsValid)   
{    
//Save the employee in DB first and then redirectToAction. 
      return RedirectToAction("Index");   
    } 
} 

READING:

  1. ASP.NET MVC3: ValidationType ModelClientValidationRule

  2. How does DataAnnotations really work in MVC?

  3. ASP.NET MVC 3 client-side validation with parameters

  4. http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

  5. Add Sorting and Searching in Contact Management ASP.NET MVC Application

  6. http://trainingkit.webcamps.ms/AspNetMvc.htm

  7. ValidationSummary and ValidationMessageFor with custom CSS shown when no errors present

  8. http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-1

  9. What is the better ASP.NET MVC 3.0 Custom Validation approach

  10. http://dotnetslackers.com/articles/aspnet/Validating-Data-in-ASP-NET-MVC-Applications.aspx

+0

您是否在使用任何爲您創建實體的ORM?或者您創建了自己的POCO? – CjCoax 2012-02-19 06:10:02

+0

我只是在學習MVC。我使用了我在控制器頁面中創建的Employee對象。我在另一個問題中發佈了類似的方法。請參閱http://stackoverflow.com/questions/9340093/asp-net-mvc3-object-from-dropdownlist-in-null-in-controller。另外,在真實情況下,我將使用WCF調用獲取數據庫值。我打算直接從控制器調用WCF服務。那是好方法嗎? – Lijo 2012-02-19 06:12:26

+0

下面提到的方法適用於此嗎? http://stackoverflow.com/questions/9349766/asp-net-mvc3-validationtype-modelclientvalidationrule。 – Lijo 2012-02-19 14:37:41

回答

2

您的模型可以實現IValidatableObject(內System.ComponentModel.DataAnnotations namespace

你的模式應該是類似下面:

public class Employee : IValidatableObject 
{ 

    public string EmployeeName; 


    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     char secondNameChar = EmployeeName[1]; 
     char thirdNameChar = EmployeeName[2]; 

     if (secondNameChar.ToString().ToLower() != "e") 
      yield return 
       new ValidationResult("Second char of name should be 'E'", 
            new[] {"EmployeeName"}); 
     if (thirdNameChar.ToString().ToLower() != "f") 
      yield return 
       new ValidationResult("Third char of name should be 'F'", 
            new[] {"EmployeeName"}); 


    } 
} 

請注意,將員工的其他屬性添加到t他的課程,並在Validate方法中進行驗證。

現在在控制器上,如果您對無效對象調用ModelState.IsValid,則此操作將失敗並返回兩個錯誤並將它們同時顯示給用戶。

+0

我已提高您的建議。不管怎樣,下面提到的方法適用於此? http://stackoverflow.com/questions/9349766/asp-net-mvc3-validationtype-modelclientvalidationrule。 – Lijo 2012-02-19 14:37:23

+0

你可以使用自我驗證(實現IValidatableObject),只要你有你的實體。您也可以在WCF服務中的實體上使用此方法(驗證您的數據合同)。 – CjCoax 2012-02-19 23:24:26

2

可以使用ModelState.AddModelError添加服務器端錯誤。當ModelState包含錯誤時,將導致ModelState.IsValid錯誤。

[HttpPost]  
public ActionResult Create(Employee emp)  
{   
if (YourServerValidation(emp) == false) 
{ 
    ModelState.AddModelError("EmpName", "Invalid value"); 
} 

if (ModelState.IsValid)   
{    
    //Save the employee in DB first and then redirectToAction. 
    return RedirectToAction("Index");   
} 
else 
{ 
    return View(emp); 
} 

你的觀點應該進行如下更新:

<div> 
    EmpName :~: @Html.TextBoxFor(model => model.EmpName) 
    @Html.ValidationMessageFor(model => model.EmpName) 
</div> 
+0

我已提高您的建議。不管怎樣,下面提到的方法適用於此? http://stackoverflow.com/questions/9349766/asp-net-mvc3-validationtype-modelclientvalidationrule。 – Lijo 2012-02-19 14:37:29