2015-01-29 3 views
1

클라이언트 쪽에서 원격 유효성 검사를 통해 사용자 이름의 유효성을 검사하려고했는데 모듈 작성에 중복 필드를 추가하는 동안 제대로 작동하지만 이제는 동일한 이름을 사용하여 레코드를 편집 할 수 없습니다 그것은 나에게 내가 정의한 동일한 오류를 보여주고있다. 가능한 모든 방법을 시도했지만 성공하지 못했습니다. 나는이 링크를 따라 갔지만 어느쪽으로도 작동하지 않는다.mvc 영향 원격 편집

http://stackoverflow.com/questions/4778151/asp-net-mvc-3-remote-validation-to-allow-original-value http://stackoverflow.com/questions/6407096/asp- net-mvc-3-remote-attribute-passing-3-fields

여기 내 코드는 지금까지 시도한 것입니다. 도움말 전문가.

[Required] 
     [Remote("IsUserAvailable", "User", HttpMethod = "Post", ErrorMessage = "User already exist.", AdditionalFields = "InitialUserName")] 
     [RegularExpression(@"^(?![\W_]+$)(?!\d+$)[a-zA-Z0-9 ]+$", ErrorMessage = "Invalid UserName ")] 
public string UserName { get; set; } 


[HttpPost] 
    public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, string initialUserName) 
    { 

     var result = uDbContext.Users.FirstOrDefault(a => a.UserName == UserName); 
     if (result == null) 
     { 
      return Json(true, JsonRequestBehavior.AllowGet); 
     } 
     return Json(JsonRequestBehavior.AllowGet); 
    } 


@model User.ViewModel.ViewModelUser 
@using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken() 
     @Html.ValidationSummary(true) 
     @Html.HiddenFor(m => m.User.UserId) 



       @Html.LabelFor(m.User.UserName) 


       @Html.TextBoxFor(m => m.User.UserName) 
       @Html.ValidationMessageFor(m.User.UserName) 
       @Html.Hidden("initialUserName", Model.User) 
      </div> 
     </div> 
} 

전문가의 도움을 받아 과제를 완료하십시오.

답변

2

User 그렇게

@Html.Hidden("initialUserName", Model.User) 

<input type="hidden" name="initialUserName" value="YourAssemly.User" ... /> 

같은 것을 생성 할 가능성이 복잡한 개체로 나타납니다 유효성 검사에 도움이되지 않습니다.

당신은

            
 
  
             public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, string initialUserName)
            
 
public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, [Bind(Prefix = "User.InitialUserName")]string initialUserName) 
{ 
    if (UserName == initialUserName) 
    { 
    // Nothing has changed so signal its valid 
    return Json(true, JsonRequestBehavior.AllowGet); 
    } 
    // Check if the user name already exists 
    var result = uDbContext.Users.FirstOrDefault(a => a.UserName == UserName); 
    return Json(result == null, JsonRequestBehavior.AllowGet); 
} 

사이드 노트를 사용하여 컨트롤러의 값을 비교 한 후

            
 
  
             @Html.Hidden("InitialUserName", Model.User.UserName)
            
 
@Html.Hidden("User.InitialUserName", Model.User.UserName) 

등을 사용하여 원래 이름을 다시 전송하여 검증을 무시할 수 : JQuery와 리모컨을 유효성 검사는 GET 호출이므로 [HttpPost] 특성이 필요하지 않습니다.

jquery-validate.jsjquery-validate-unobtrusive.js 파일을 모두 디버깅 후 편집

, 그것은 속성이 검증 된 것으로 어떤 AdditionalFields의 이름 속성이 같은 접두사를 포함해야한다는 것을 밝혀, 그리고 [Bind(Prefix="..")] 속성은 다음도에 필요하다고 상기 방법에서 그 파라미터 (상기 개정 참조)

대안 다시 게시하는 간단한 클래스를 만들 수도

,

public class ValidateUserNameVM 
{ 
    public string UserName { get; set; } 
    public string InitialUserName { get; set; } 
} 

public JsonResult IsUserAvailable([Bind(Prefix = "User")]ValidateUserNameVM model) 
{ 
    if (model.UserName == model.InitialUserName) 
    .... 
+0

편집을 위해 여전히 같은 오류가 발생합니다. 해당 레코드를 편집 할 수 없습니다. –

+0

그런 다음 다른 일이 발생합니다. 그리고 그 레코드를 편집 할 수 없다는 것은 무엇을 의미합니까? 원격 특성은 유효성 검사에 실패하면 오류 메시지를 표시합니다. 사용자가 편집을 못하게하지는 않습니다. –

+0

'UserName'과'InitialUserName' 값이 정확하고 예상대로입니까? –

0

유효성 검사 기능이 완료되지 않았습니다. 모델의 UserName 특성에 [Required] 속성을 넣고이 시도 :

public JsonResult IsUserAvailable(string userName, string initialUserName) 
{ 
    if (userName.Trim().ToLower() != (initialUserName ?? "").Trim().ToLower()) 
    { 
     var result = YourMethodToCheckTheDatabaseForUsernameIsAvailable(userName); 
     return Json(result, JsonRequestBehavior.AllowGet); 
    } 
    return Json(true, JsonRequestBehavior.AllowGet); 
} 
+0

귀하의 빠른 응답에 대한 감사합니다하지만 만약 내가 ....이 코드 조각에 오류가 점점 오전 (userName.Trim(). ToLower는()! = initialUserName.Trim(). ToLower는 ()) –

+0

내가 알 수있는 오류를 모른 채 ... initialUserName null입니까? – joelmdev

+0

예, 개체 참조가 개체 인스턴스로 설정되지 않았습니다.그리고 null 값을 얻고있다 –