2015-03-24 37 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

相關問題