2013-08-26 1 views
0

У меня есть частичное представление, содержащее регистрационную форму со следующими полями:Посмотреть модель отсутствие в форме регистрации

  1. E-Mail
  2. Имя
  3. Фамилия
  4. Пароль

Я отправляю форму с помощью jQuery Ajax без использования View Model.

Вопрос: Это хороший подход, чтобы не использовать 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, то вы можете использовать модель для привязки к которому будет использоваться (по умолчанию) Newton 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" 
     } 
    } 
}