2013-01-11 1 views
1

저는 MVC를 처음 사용하지만 다른 그룹에서 만든 기존 코드를 일부 변경했습니다.MVC는 ajax.beginform을 사용하여 부분 뷰에서 데이터를 제출하고 저장할 수 없습니다.

몇 가지 부분보기가있는 사용자 데이터보기가 있으며 "프로필"섹션 (이름, 전화 번호 등)을 업데이트하고 싶습니다. 문제는 "저장"버튼을 클릭해도 아무런 효과가 없습니다. 컨트롤러에 중단 점을 설정하더라도 해당 코드에 도달하는 사이트가 표시되지 않습니다.

현재 코드의 주요 부분입니다.

"사용자 상세"보기 :

@model UserDetailsModel 

@{ 
    Layout = "~/Views/Shared/_ApplicationLayout.cshtml"; 
} 

... 

<h2>User Details</h2> 
... 
<hr /> 

<div class="row"> 
    <div class="span2"> 
    <ul class="nav nav-pills nav-stacked" id="js-side-nav" data-spy="affix"> 
     <li class="active"><a href="#profile">Profile</a></li> 
     <li><a href="#userdevices">Functions</a></li> 
... 
    </ul> 
</div> 
<div class="span10"> 
    <ul class="unstyled"> 
     <li id="profile"> 
      <h3>Profile</h3> 
      @Html.Partial("_UserProfile", Model.ProfileModel) 
      <hr /> 
     </li> 
     <li id="functions"> 
      <h3>Functions</h3> 
      @Html.Partial("_UserFunctions", Model.FunctionsModel) 
      <hr /> 
     </li> 
... 

"사용자 프로필"부분보기 :

// (I 추가 HttpMethod = "포스트")

@model UserProfileModel 

<section id="user-profile-section"> 
    @using (Ajax.BeginForm("UserProfile", "UserDetail", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "user-profile-section", InsertionMode = InsertionMode.Replace})) 
{ 
    @Html.EditorForModel("CustomForm") 
    <input class="btn btn-primary" type="submit" value="Save Profile"/> 
} 
</section> 

"사용자 상세" 컨트롤러 :

// ([System.Web.Http.HttpPost]를 추가 함)

(210)
[System.Web.Http.HttpPost] 
public ActionResult UserProfile(Guid userId, [FromBody] UserProfileModel model) 
{ 
if(!Request.IsAjaxRequest()) 
    throw new Exception("Expecting ajax request"); 

if(!ModelState.IsValid) 
     return PartialView("_UserProfile", model); 

var service = new UserService(); 
    WebUser user = service.GetUserProfile(userId, SessionState.ApplicationId); 
    Mapper.DynamicMap(model, user.Profile, model.GetType(), user.Profile.GetType()); 
    service.UpdateUser(user); 

return PartialView("_UserProfile", model); 
} 

"사용자 프로필"모델 :

using System.ComponentModel.DataAnnotations; 

namespace UserDetail 
{ 
public class UserProfileModel 
{ 
    [Required] 
    [Display(Name = "First Name")] 
    public string ContactFirstName { get; set; } 

    [Required] 
    [Display(Name = "Last Name")] 
    public string ContactLastName { get; set; } 

    [Display(Name = "Business Phone")] 
    public string ContactBusinessPhone { get; set; } 

... 

ClientValidationEnabled 및 UnobtrusiveJavaScriptEnabled은 Web.config의에 TRUE로 설정됩니다.

먼저 코드가 컨트롤러의 UserProfile 섹션에 도달하도록하고 service.UpdateUser() 메서드가 작동하는지 확인해야합니다. 몇 가지 옵션을 확인하고 검색하여 시도했으며 과 내가 누락 된 항목을 찾지 못했습니다. 결국, 분명히, 나는 데이터를 업데이트 할 수 있기를 원한다.

감사합니다.

+0

업데이트 : @ Html.Action ("UserProfile")을보기에 추가하면 코드에 접근 할 수 있지만 "Ajax 요청 예상"오류가 발생합니다. – user1970778

답변

0

일부 필드에 유효성 검사가 실패했지만 해당 유효성 검사 메시지가 없거나 숨겨져 있기 때문에 오류가 표시되지 않습니다. 아마도 이것을 테스트하기 위해서는 제출 버튼을 제외한 양식의 전체 내용을 제거하고 성공적으로 제출하는지 확인하십시오.

troublehshooting 단계로 바로 시도하는 또 다른 것은, 변화 단지로, 간단한 Html.BeginForm에 ...이

@using (Ajax.BeginForm("UserProfile", "UserDetail", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "user-profile-section", InsertionMode = InsertionMode.Replace}))

을 (코멘트에 복사 테스트 후 복원 할)입니다 updateTargetId를 찾을 수 없을 가능성이있는 AJAX에 문제가있을 가능성을 판단/배제하십시오.

또한 Chrome에서 F12를 열고 콘솔 탭으로 전환하고 페이지를 새로 고침하여 제출하여 자바 스크립트 오류가 표시되는지 확인하십시오.

마지막으로 [FromBody] 속성을 임시로 제거해보십시오. 일부 속성은 라우팅에 영향을 미치며,이 속성이 사용되는지는 확실하지 않습니다.

+0

확인. 우리는 지금 장소를 움직이고 있습니다. Html.BeginForm으로 변경되어 컨트롤러의 액션 결과로 보내지는 "userId"매개 변수가 null이되었습니다.어떻게/어디에서 설정할지 지금 찾으려고 노력합니다. 그것은 URL의 일부입니다. – user1970778

+0

크롬에서 요소 탭 아래의 F12를 사용하고 Ctrl + F를 사용하여 'userId'를 검색하여 양식 내에 숨겨진 요소가 있는지 확인합니다. 그렇지 않다면, 당신의 모델에서 사용할 수 있다고 가정하고,'new {userId = Model.UserId} '를 넘겨주는 routeValues ​​매개 변수를 취하는 BeginForm의 오버로드가 있습니다. 이 라우트 값은 양식 제출 URL의 일부로 양식에 추가됩니다 (브라우저에서 생성 된 HTML을 볼 수 있으므로 양식 작성 방법을 볼 수 있음). – AaronLS

+0

지금 작동 중입니다. 여기에 내가 변경 한 것입니다 -> 1) 컨트롤러에 전달할 수 있도록 뷰에 표시하지 않도록 모델에 추가했습니다. [Display (Name = "")] [HiddenInput (DisplayValue = false)] 공용 문자열 UserId {get; 세트; } 2) 컨트롤러에서 첫 번째 매개 변수를 수정하여 URL에서 값을 읽습니다. [FromUri] Guid userId 3) Ajax.BeginForm 끝에 매개 변수를 보내기 위해 this를 추가했습니다. new {userId = Model.UserId} – user1970778

관련 문제