2013-08-26 28 views
0

我有一個包含以下字段的登記表的局部視圖:視圖模型沒有在登記表

  1. 電子郵件
  2. 密碼

我使用jQuery Ajax發佈表單而不使用View Model。

問題:這是對他的情況下不使用視圖模型的好方法嗎?

問題:我的方法在單元測試用例的情況下是無用的嗎?

jQuery的

$.ajax({ 
    url: "@Url.Action("Action", "Controller", new { area = "Area" })", 
    type: "POST", 
    contentType: 'application/json; charset=utf-8', 
    dataType: "json", 
    data: JSON.stringify({mail : "mails", nam : nam ......}), 
    traditional: true, 
    success: function (data) { 
     alert("wsaved"); 
    } 
}); 

[HpPost] 
public Actionresult abc(string mail, string nam, sring lasnam) 
{ 
    return Json(new {succss = ru}); 
} 

回答

1

它是在他的語境中不應使用視圖模型的好方法嗎?

不,它會使驗證更加困難。假設你想驗證電子郵件不是空的,並且確實是一個有效的電子郵件地址。如果您使用視圖模型,則只需使用正確的驗證屬性在視圖模型上裝飾Email屬性。用你的方法,你現在必須在你的控制器動作中編寫幾行無用的代碼。

這是你的視圖模式如何看起來像:

public class RegisterUserViewModel 
{ 
    [Required] 
    [RegularExpression("PUT YOUR REGEX TO VALIDATE AN EMAIL HERE")] 
    public string Email { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    [Required] 
    [RegularExpression("PUT YOUR REGEX TO ENFORCE SOME PASSWORD STRENGTH")] 
    public string Password { get; set; } 
} 

,現在你的控制器動作變爲:

[HttpPost] 
public ActionResult Register(RegisterViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // validation failed 

     var errors = ModelState 
      .Where(x => x.Value.Errors.Count > 0) 
      .Select(x => new 
      { 
       Key = x.Key, 
       Errors = x.Value.Errors.Select(e => e.ErrorMessage) 
      } 
     ); 

     return Json(new { success = false, errors = errors }); 
    } 

    return Json(new { success = true }); 
} 
+0

是我的方法沒用在單元測試用例呢? – SMC

+0

不,這不是無用的。您將單元測試此控制器操作的方式不會受到您是否使用視圖模型的影響。 –

+0

你知道,有時候,像我這樣的人(小/愚蠢的開發者只有60的聲望)認爲,達林是錯誤的......他正在使用View Model。那麼他可能會爲客戶端提供不顯眼的/流暢的驗證。但是,這可能是正確的。是不是大削減而不是捷徑?因爲最後你說我的方法適合單元測試用例。那麼是否有任何介於兩者之間的方法,適合我的單元測試用例和前端功能的上下文? – SMC

0

如果您使用的是ApiController與MVC 4,那麼你可以使用一個模型綁定到,這將使用(默認情況下)牛頓Json.NET。

ResponseModel

[DataContact] 
public class ResponseModel 
{ 
    [DataMember] 
    public string Status { get; set; } 
} 

ActionModel

[DataContact] 
public class RegisterUserViewModel 
{ 
    [Required] 
    [DataMember(isRequired=true)] 
    public string Email { get; set; } 

    [DataMember] 
    public string FirstName { get; set; } 

    [DataMember] 
    public string LastName { get; set; } 

    [Required] 
    [DataMember(isRequired="true")] 
    public string Password { get; set; } 
} 

ApiController行動

[HttpPost] 
public ReponseModel Register(RegisterActionModel actionModel) 
{ 
    if (this.ModelState == valid) 
    { 
     //do stuff 
     return new ResponseModel() 
     { 
      Status = "OK" 
     }; 

    } 
    else 
    { 
     return new ResponseModel() 
     { 
      Status = "Invalid Data" 
     } 
    } 
}