2012-02-14 2 views
0

사용자는 IDE와 함께 제공된 AspNetSqlProfileProvider를 사용하여 내 사이트의 어딘가에서 프로파일 정보를 작성하게합니다.@ Html.EditorForModel()을 사용하여 양식을 작성할 때 특정 필드를 자동으로 채우는 방법은 무엇입니까?

프로필을 편집 할 양식이 자동으로 채워지는 프로필 수정 페이지로 이동하여 내 프로필을 언제든지 편집 할 수 있습니다. 나는 현재 뷰에 내 컨트롤러에서 (예를 들어, 주소 및 도시) 사용자 프로필의 각 부분을 보낼 ViewBag를 사용하여이 작업을 수행 :

컨트롤러를 얻을 :

ViewBag.address = CustomProfile.GetUserProfile(User.Identity.Name).Address; 
ViewBag.city = CustomProfile.GetUserProfile(User.Identity.Name).City; 

보기 :

<div class="editor-field"> 
     @Html.TextBox("Address", (string)ViewBag.address) 
    </div> 

    <div class="editor-field"> 
     @Html.TextBox("City", (string)ViewBag.city) 
    </div> 

컨트롤러 게시물 :

public ActionResult ChangeProfile(FormCollection favorites) 
    { 
     CustomProfile profile = CustomProfile.GetUserProfile(); 
     profile.Address = favorites["Address"]; 
     profile.City = favorites["City"]; 
     profile.Save(); 
     return RedirectToAction("Profile"); 
    } 

(가) 위의 편집 프로필에 대해 잘 작동, 그것은 내 사용자의 관점에서 보면 매우 매끄 럽습니다. (온라인에서 질문/답변을 읽으면 ViewModel을 사용해야하며 정확히 어떻게 전환해야하는지 확실하지는 않습니다 - 실패했습니다).

내 사용자가 웹 사이트에서 '결제'를하면 쇼핑을 할 수있는 최종 정보를 입력 할 수있는 화면이 표시됩니다. 이것을 "주문 페이지"라고합시다. 이러한 세부 정보에는 이름, 주소, 신용 카드 정보 등이 포함됩니다. 이러한 정보 중 일부는 웹 사이트의 프로필 페이지에있는 정보와 동일합니다.

필드의 일부를 비워 두면서이 주문 페이지 (이름, 주소)의 세부 정보를 자동으로 채울 수 있기를 원합니다 (신용 카드 - 사용자가 방문 할 때마다이 세부 정보를 입력해야 함). 주문 페이지).

주문 페이지의 작동 방식은 MVC Store Tutorial describes입니다.

큰이며 (이름이 요구되는 주문 모델 내에서 지정된 세부 사항을 편집하고 데이터 검증 물건 수 있습니다
@Html.EditorForModel() 

, 주소가 필요합니다 주문 페이지가 표시되면 그것을 사용하여 양식을 표시합니다 신용 카드 번호, 이메일 형식이 올바른지 등),이 주문 페이지의 특정 필드에 내 사용자 프로필의 세부 정보를 채우는 방법을 알 수 없습니다.

내 프로필에 포함 된 정보 만 사용하는 새로운 ViewModel을 만들려고했지만 원하는 결과를 얻지 못해서 무엇이 필요한지 명확히 파악하지 못했습니다.

프로필 정보로 주문 모델을 사용하는 것을 고려해 봤지만 두 가지 모두에서 서로 다른 정보를 사용할 수 있기 때문에 충분하지 않습니다.

프로필 정보를 주문 모델로 사용하는 것을 고려해 보았지만 사용자가 실제로 주문하는 데 사용하는 정보와 별도로 프로필 정보를 따로 저장할 수 있기를 바랍니다.

"@ Html.EditorForModel()"을 사용하는 동안 특정 필드를 자동으로 채우는 방법은 무엇인가 구체적으로 알고 싶습니다.

내 전반적인 상황에 도움이 될만한 다른 도움이 있다면, 필자는 자신의 흐름을 단순화 할 충고에 대해 매우 개방적입니다. (필자는 자신이 필요로하는 것보다 더 힘들게 만들고있는 것처럼 느낍니다. 협업은 신선한 공기의 숨결처럼 느껴질 것입니다).

답변

3

질문의 첫 번째 부분 만 따라갈 수있었습니다. 그것은 당신이 내가 당신을 도울 수있는 코드와 코드를 보여 주었던 것입니다. 후반은 나를 위해 완전한 안개이었다.

그래서보기를 디자인하려면이보기에서 표시/수정해야하는 필드를 생각하십시오.

public class ChangeProfileViewModel 
{ 
    [Required] 
    public string Address { get; set; } 

    [Required] 
    public string City { get; set; } 
} 

을하고이 뷰는 뷰 모델 채울 렌더링하도록되어 당신의 GET 컨트롤러 액션이 : 그리고 그것을 위해 뷰 모델을 설계하는 것입니다

public ActionResult ChangeProfile() 
{ 
    CustomProfile profile = CustomProfile.GetUserProfile(User.Identity.Name); 
    ChangeProfileViewModel model = new ChangeProfileViewModel 
    { 
     Address = profile.Address, 
     City = profile.City 
    }; 
    return View(model); 
} 

다음 해당 뷰를 디자인

@model ChangeProfileViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
    <button type="submit">OK</button> 
} 

을 마지막으로이 양식의 제출을 ​​처리하는 POST 컨트롤러 액션이 : 강력이보기 모델에 입력

[HttpPost] 
public ActionResult ChangeProfile(ChangeProfileViewModel model) 
{ 
    if (!Model.IsValid) 
    { 
     // there were validation errors => redisplay the view 
     return View(model); 
    } 

    // validation succeeded => process the results 
    CustomProfile profile = CustomProfile.GetUserProfile(); 
    profile.Address = model.Address; 
    profile.City = model.City; 
    profile.Save(); 
    return RedirectToAction("Profile"); 
} 

지금 우리가 여기서 관찰하는 것은 모두 우리의 GET 및 POST 작업에서 우리는 우리의 도메인 모델 (CustomProfile) 및 우리의 견해 모델 (ChangeProfileViewModel) 사이의 반복적 인 매핑 코드를 가지고있다. 이 문제를 해결하려면 AutoMapper을 사용하는 것이 좋습니다.

public ActionResult ChangeProfile() 
{ 
    CustomProfile profile = CustomProfile.GetUserProfile(User.Identity.Name); 
    ChangeProfileViewModel model = Mapper.Map<CustomProfile, ChangeProfileViewModel>(profile); 
    return View(model); 
} 

또는 심지어 사용자 지정 작업 필터 :

[AutoMap(typeof(CustomProfile), typeof(ChangeProfileViewModel))] 
public ActionResult ChangeProfile() 
{ 
    CustomProfile profile = CustomProfile.GetUserProfile(User.Identity.Name); 
    return View(profile); 
} 

하고 POST 액션에 : 그것은 당신의 GET 작업을 단순화 할 수있는 뷰에 대해 아는 것이 중요 무엇

[HttpPost] 
public ActionResult ChangeProfile(ChangeProfileViewModel model) 
{ 
    if (!Model.IsValid) 
    { 
     // there were validation errors => redisplay the view 
     return View(model); 
    } 

    // validation succeeded => process the results 
    CustomProfile profile = CustomProfile.GetUserProfile(); 
    Mapper.Map<ChangeProfileViewModel, CustomProfile>(model, profile); 
    profile.Save(); 
    return RedirectToAction("Profile"); 
} 

모델은 각 뷰에 대해 항상이 뷰를 사용하고 이러한 뷰가 처리해야하는 특정 정보 만 포함하도록 디자인해야합니다. 도메인 엔티티와 뷰 모델 간의 변환을 처리하는 매핑 레이어로 이동합니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 나는이 시간에 잠을 잔다. 그래서 아침에 그것을 시험해보아야 할 것이다. 그러나 ViewModels에 대한 훨씬 더 풍부한 뷰를 내게 준 것처럼 보인다. 원래의 게시물에 대한 이해가 부족한만큼, 나는 2 회의 세션 (긴 전화를받은 후에 하나의 세션)에서이를 썼습니다. 아마도 내 숲을 통과하여 수정할 수 있습니다. 나에게 제공 한 것에 집중할 시간이 많아지면 업데이트 할 예정입니다. – Ecnalyr

+0

필드를 자동으로 채울 수있었습니다. 고맙습니다. 그러나 오토 매퍼 (AutoMapper)를 내 두 모델 ('예외'가 발생 함) 사이에 매핑 할 수 없었습니다. 프로젝트의이 부분으로 돌아가서 상황을 개선 할 때 더 많은 것을 얻게 될 것입니다. 다시 한번 감사드립니다. – Ecnalyr

관련 문제