1

MVC5 응용 프로그램을 함께 사용하면 사용자가 고객 또는 영업 사원으로 등록하게됩니다. 로그인 세부 정보는 생성 된 동일한 기본 [AspNetUsers] 테이블에 들어갈 수 있지만 그들이 소매인 인 경우 추가 세부 정보를 수집해야합니다. 내가 만들고있는 애플리케이션과 함께 제공되는 코드 중 일부를 살펴보면 다음에해야 할 작업이나 사용하는 방법이 올바르지 만 다소 혼란 스럽습니다. . 내가 등록 정보가 채워지에 따라 중 하나 세트를 수집하는 것을 목표로하고 있습니다MVC5 응용 프로그램에 등록하는 동안 추가 정보 얻기

내 계정/컨트롤러를 등록하는 것은 다음과 같이 시작된다

그래서 것 내 질문에 내가 '무엇
[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
    public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
     using (var context = new ApplicationDbContext()) 
     { 
      if (ModelState.IsValid) 
      { 
       var user = new ApplicationUser 
       { 
        FirstName = model.FirstName, 
        LastName = model.LastName, 
        UserName = model.Email, 
        Email = model.Email 
       }; 
       var result = await UserManager.CreateAsync(user, model.Password); 

       var roleStore = new RoleStore<IdentityRole>(context); 
       var roleManager = new RoleManager<IdentityRole>(roleStore); 

       var userStore = new UserStore<ApplicationUser>(context); 
       var userManager = new UserManager<ApplicationUser>(userStore);      

       if (result.Succeeded) 
       { 
        if (model.CompanyName.Trim().Length > 0) 
        { 
         var company = new CompanyModel 
         { 
          CompanyName = model.CompanyName, 
          AddressLine1 = model.AddressLine1, 
          AddressLine2 = model.AddressLine2, 
          Town = model.Town, 
          County = model.County, 
          Postcode = model.Postcode, 
          TelNo = model.TelNo, 
          MobNo = model.MobNo, 
          GoogleVerified = model.GoogleVerified, 
          FacebookProfileUrl = model.FacebookProfileUrl 
         }; 

         //insert company details? 
        }       

        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 

        // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
        // Send an email with this link 
        // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 
        // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
        // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"); 

        return RedirectToAction("Index", "Home"); 
       } 
       AddErrors(result); 
      } 

      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 
    } 

올바른 일을하는 것/좋은 일을하는 것, 같은 컨트롤러를 통해 두 가지 유형의 사용자에 대한 세부 정보를 수집 할 수 있습니까?

Register.cshtml 페이지에서 jquery 아코디언이 있는데, 클라이언트라는 개념은 하나의 섹션을 채우고 가입하거나 아코디언을 클릭하면 다른 섹션을 채울 수 있습니다. 그런 다음 내가 겪는 문제 나는 한 번 코드 줄 사용하고있다 : 나는이 컨트롤이 의미하는

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 

{

다음이 내부의 아코디언 컨트롤을 앉아

@Html.LabelFor(m => m.FirstName, new { @class = "col-md-2 control-label" }) 

두 번, 한 번 사용자와 한 번은 소매인에게 허용됩니까?

+0

네, 할 수 있습니다. 나는 당신이'FirstName'을위한 2 개의 텍스트 박스를 가지고 있다는 것을 의미한다고 생각하십니까? 첫 번째 요소 만 바인딩되므로 무의미합니다. 왜 사용자에게 동일한 데이터를 반복하도록 요청할 것입니까? –

+0

아코디언은 두 부분으로 나뉘어져 있으며 두 부분으로 구성되어 있고 두 부분에는 버튼이 있습니다.아이디어는 아코디언 중 하나에 '고객으로 등록'이라고 말하면서 성, 성, 이메일 등을 기입하고 소매업 자로 등록하려면 하단 아코디언을 클릭하고 수집 할 동일한 세부 사항을 firstname, 성, 이메일뿐만 아니라 다른 정보 (위와 같음). 하나의 이름 컨트롤과 하나의 성 컨트롤 만 가질 수 있습니까? 아니면 어떻게 든 FormMethod.Post 파트 중 두 개를 사용하고 제출 된 양식에 따라 다른 양식을 보낼 수 있습니까? 감사합니다 –

+0

당신은 하나의 뷰 모델과 하나의 폼과 하나의 포스트 메소드를 가져야합니다 (뷰 모델에는 선택된 옵션에 기반한'[RequiredIf]'속성이 필요합니다 .post 메소드에서, 당신은 선택된 옵션의 값을 검사 할 수 있습니다. '상인'이라면 다른 테이블에 추가 세부 정보를 저장하십시오. –

답변

2

추가하기 <label> 두 번 괜찮지 만, 나는 (1)은 잘못된 HTML (2) DefaultModelBinder는 것입니다 id 속성을 중복 생성하기 때문에 미세하지 않은, 그런 다음 관련 @Html.TextBoxFor(m => m.FirstName)뿐만 아니라 중복이 있어야합니다 가정 첫 번째 입력이 name="FirstName" 인 경우 값을 바인딩하십시오.

컨트롤을 반복 할 이유가 없습니다. 대신 CompanyModel과 연결된 뷰 모델 속성을 조건부 유효성 검사 속성 (예 : foolproof[RequiredIf])으로 장식하십시오. 따라서 사용자가 영업 담당자 인 경우 필요합니다. 사용자가 영업 담당자가 될 수 있음을 나타내므로 bool 속성을 사용하여 확인란을 생성하십시오. 가시성이 IsTradesPerson 재산

<div id="usercontrols"> 
    @Html.LabelFor(m => m.FirstName) 
    @Html.TextBoxFor(m => m.FirstName) 
    @Html.ValidationMessageFor(m => m.FirstName) 
    .... 
    @Html.LabelFor(m => m.IsTradesperson) 
    @Html.CheckBoxFor(m.IsTradesperson) 
</div> 
<div id="tradespersoncontrols" hidden> 
    @Html.LabelFor(m => m.CompanyName) 
    @Html.TextBoxFor(m => m.CompanyName) 
    @Html.ValidationMessageFor(m => m.CompanyName) 
    .... 
<div> 

기반으로 전환 할 수 있도록 뷰 모델은 숨겨진 <div> 요소에 CompanyModel 모델과 관련된 컨트롤을 배치,

public class RegisterViewModel 
{ 
    // Properties associated with ApplicationUser 
    [Display(Name = "Company Name")] 
    [Required(ErrorMessage = "Please enter your First Name")] 
    public string FirstName { get; set; } 
    .... 
    public bool IsTradesPerson { get; set; } 
    // Properties associated with CompanyModel 
    [Display(Name = "Company Name")] 
    [RequiredIfTrue("IsTradesPerson", ErrorMessage = "Please enter your Company Name")] 
    public string CompanyName { get; set; } 
    .... 
} 

추천하고보기에 보일 것이다 가시성을 전환하는 스크립트

var controls = $('tradespersoncontrols'); 
$('#IsTradesperson').click(function) { 
    if ($(this).is(':checked')) { 
     controls.show(); 
    } else { 
     controls.hide(); 
    } 
}); 

그런 다음 POST 메서드에서을 확인할 수 있습니다이면보기 모델 속성을 기반으로 CompanyModel을 만들고 저장하십시오.

+0

죄송합니다 단지이 매우 도움이 응답을 발견, 대단히 당신의 입력과 시간을 주셔서 감사합니다 :) –

관련 문제