2015-03-24 38 views
0

我有一个MVC网站,当一个领域失去焦点时,它将读取后端数据库并确定该值是否有效。如果该值有效,则会在页面上填写另外两个字段。我遇到的问题是,该值无效,我想在文本框下显示一条错误消息,就像验证消息一样。MVC 4 - 来自控制器的错误消息没有显示在视图中

的观点....

@Html.ValidationSummary(true)  
<div class="form-group"> 
    @Html.LabelFor(m => m.HSDRepCode) 
    @Html.TextBoxFor(m => m.HSDRepCode, new { placeholder = "Enter your HSD Rep code...", @class = "contact-name" }) 
    @Html.ValidationMessageFor(m => m.HSDRepCode) 
</div> 

调用脚本...

$("#HSDRepCode").blur(function() { 
     $.ajax({ 
      url: "/CRM/ValidateHSDRep", 
      type: "POST", 
      data: $('form').serialize(), 
      dataType: "json" 
     }).done(function (model) { 
      $("#HSDRepCode").val(model.HSDRepCode); 
      $("#HSFirstName").val(model.HSFirstName); 
      $("#HSLastName").val(model.HSLastName); 
     }); 
    }); 

模型....

public class LeadInfo 
{ 
    [Display(Name = "Products of Interest")] 
    [Required(ErrorMessage = "Please select a product of interest")] 
    public string Product { get; set; } 

    [Display(Name = "HSD Rep code")] 
    [Required(ErrorMessage = "Please enter your HSD Rep code")] 
    [StringLength(6)] 
    public string HSDRepCode { get; set; } 

    [Display(Name = "HSD Rep first name")] 
    [Required(ErrorMessage = "Please enter your first name")] 
    public string HSFirstName { get; set; } 

    [Display(Name = "HSD Rep last name")] 
    [Required(ErrorMessage = "Please enter your last name")] 
    public string HSLastName { get; set; } 

    [Display(Name = "Doctor's first name")] 
    [Required(ErrorMessage = "Please enter the doctor's first name")] 
    public string FirstName { get; set; } 

    [Display(Name = "Doctor's last name")] 
    [Required(ErrorMessage = "Please enter the doctor's last nname")] 
    public string LastName { get; set; } 

    [Display(Name = "Doctor's phone number")] 
    [Required(ErrorMessage = "Please enter the doctor's phone number")] 
    [Phone] 
    public string PhoneNumber { get; set; } 

    [Display(Name = "Doctor's e-mail")] 
    [Required(ErrorMessage = "Please enter the doctor's e-mail")] 
    [EmailAddress] 
    public string EmailAddress { get; set; } 
} 

和控制器....

public ActionResult ValidateHSDRep(LeadInfo leadInfo) 
{ 
    HSDRep hsdRep = new HSDRep(); 

    hsdRep = CRMModels.ValidateHSDRepCode(leadInfo.HSDRepCode); 

    if (hsdRep.FirstName != null) 
    { 
     leadInfo.HSFirstName = hsdRep.FirstName; 
     leadInfo.HSLastName = hsdRep.LastName; 

     return Json(leadInfo); 
    } 
    else 
    { 
     ModelState.AddModelError("HSDRepCode", "Invalid HS Representative Code"); 

     return Json(leadInfo); 
    } 
} 

当文本框失去焦点时调用控制器例程。

如何在文本框“HSDRepCode”下显示消息“无效代表码”?

感谢, 加里

更新:我已经添加了调用该控制器功能的Ajax代码。 更新2:我改变了返回返回Json。

+0

你为什么有两个'返回JSON()'和'返回查看()' - 你怎么调用此? – 2015-03-24 22:47:47

+0

Re:你的编辑 - 你正在返回'json',而不是视图。你不会碰到else块,所以没有任何东西被添加到'ModelState'中,如果它确实存在,那么ajax调用会失败,因为它会返回html(不是json) – 2015-03-24 22:56:40

+0

将它更改为返回Json后,它仍然不显示错误消息。 – Gary 2015-03-24 23:03:53

回答

2

您的ValidateHSDRep()方法正在返回没有模型状态概念的json。此外,通过将整个模型发送到视图,然后在您只需发送一个属性并返回两个属性时将其全部发送回来,就会不必要地降低性能。改变你的脚本只发送HSDRepCode值,并且只返回你所需要的

var url = '@Url.Action("ValidateHSDRep", "CRM"); 
$("#HSDRepCode").blur(function() { 
    $.getJSON(url, { HSDRepCode: $(this).val() }, function(response) { 
    if (response.ErrorMessage) { 
     // do something with the error message 
    } else { 
     $("#HSFirstName").val(response.HSFirstName); 
     $("#HSLastName").val(response.HSLastName); 
     // remove any associated error message that may have been added in previous calls 
    } 
    }); 
}); 

,改变控制器方法

public ActionResult ValidateHSDRep(string hSDRepCode) 
{ 
    HSDRep hsdRep = CRMModels.ValidateHSDRepCode(hSDRepCode); 
    if (hsdRep.FirstName == null) 
    { 
    return Json(new { ErrorMessage = "Invalid HS Representative Code" }, JsonRequestBehavior.AllowGet); 
    } 
    else 
    { 
    return Json(new { HSFirstName = hsdRep.FirstName, HSLastName = hsdRep.LastName; }, JsonRequestBehavior.AllowGet); 
    } 
} 

不过,既然你要包括在视图@Html.ValidationMessageFor(m => m.HSDRepCode),你可以处理该“无效的代码”使用对你RemoteAttribute模型属性

[Display(Name = "HSD Rep code")] 
[Required(ErrorMessage = "Please enter your HSD Rep code")] 
[StringLength(6)] 
[Remote("IsHSDRepCodeValid", "CRM", ErrorMessage = "Invalid HS Representative Code")] 
public string HSDRepCode { get; set; } 

然后添加一个控制器方法

public JsonResult IsHSDRepCodeValid(string HSDRepCode) 
{ 
    // code to test if valid 
    if(isValid) 
    { 
    return Json(true, JsonRequestBehavior.AllowGet) 
    } 
    else 
    { 
    return Json(false, JsonRequestBehavior.AllowGet) // displays default message defined in ErrorMessage property 
    // or 
    return Json("a custom message", JsonRequestBehavior.AllowGet) 
    } 
} 

How to: Implement Remote Validation in ASP.NET MVC参考更多详细信息使用远程验证

+0

你显示了两套代码。在第一个你有一个评论“做一些错误消息”。我该如何处理错误信息?有没有办法将其显示为验证消息。对于第二个示例是否有办法返回代表的姓和名?谢谢 – Gary 2015-03-25 14:29:35

+0

(1)对于第一个例子,为消息添加一个元素',那么你可以做' '#invalidcode')。text(reponse.ErrorMessage);'如果有错误。 (2)不,“RemoteAttribute”只返回一个值 - “true”或“false”(或“字符串” - 即错误消息) – 2015-03-25 23:44:32

+0

我正在使用选项1,因为我需要传回数据。当我执行此操作时,我收到“JavaScript运行时错误:'响应'未定义” – Gary 2015-03-26 20:33:23

-1

.AddModelError方法的第一个参数是key,您的情况是HSDRepCode,而不是hsdrepcode

所以:

ModelState.AddModelError("HSDRepCode", "Invalid Representative Code"); 

它的工作?谢谢

+0

我修改了“ModelState.AddModelError(”HSDRepCode“,”无效的HS代表代码“);”它仍然不显示。 – Gary 2015-03-24 22:40:59

+0

它不区分大小写 - 你可以使用'hSDrEpCODe',它可以工作,所以这不是问题 – 2015-03-24 22:46:03

相关问题