在注册表格中查看模型缺席

时间:2013-08-26 15:53:10

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我有一个部分视图,其中包含一个包含以下字段的注册表单:

  1. 电子邮件
  2. 名字
  3. 姓氏
  4. 密码
  5. 我在不使用View Model的情况下使用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});
    }
    

2 个答案:

答案 0 :(得分:1)

  

在他的上下文中不使用View Model是一种好方法吗?

不,它会使验证变得更加困难。假设您要验证电子邮件是否为空并且确实是有效的电子邮件地址。如果您使用了视图模型,那么您所要做的就是使用正确的验证属性修饰视图模型上的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 });
}

答案 1 :(得分:0)

如果您正在使用带有MVC 4的ApiController,那么您可以使用模型绑定到,默认使用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 Action

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

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