2013-01-07 5 views
0

약간의 문제와 내가 몹시 싫어하는 일. 기본적으로 내 viewModel에 데이터를 배치하는 양식이 있습니다. 문제는 고객 회사가 하나의 주소에 있지만 연락처가 다른 주소에 있다고 가정합니다. 사용자가 작성하는 기본 양식의 라디오 버튼을 클릭하고 주소록에 다른 주소를 입력 할 수있게하려면 이것을 기본 폼에있는 모델에 저장하십시오.MVC3 형식 jQuery PartialView

나는 다음을 수행하는 컨트롤러가 있습니다

[HttpPost] 
    public ActionResult Edit(ClientModel client) 
    { 
     Domain.Data.EFDbContext context = new Domain.Data.EFDbContext(); 
     if (ModelState.IsValid) 
     { 
      client.ClientAddress.AddressTypeId = client.AddressType.AddressTypeId; 
      client.Contact.ContactTypeId = client.ContactType.ContactTypeID; 

      //Add the address to the ContactAddress table and Contact ID 
      if (client.ContactAddress.AddressLine1 != null) 
      { 
       client.Contact.ContactAddress.Add(client.ContactAddress); 
       context.Contacts.Add(client.Contact); 
      } 
      else 
      { 
       client.ContactAddress = client.ClientAddress; 
      } 
      client.Company.Address.Add(client.ContactAddress); 
      client.Company.CompanyContact.Add(client.Contact); 

      //The attachment to Client is created on a Trigger in the database when a new Company is added 
      context.Companies.Add(client.Company); 
      context.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     else 
     { 
      return View(client); 
     } 
    } 

이 잘 작동, 그것은 내 데이터베이스 테이블을 업데이트하고 결과를 저장,하지만 나는 client.ContactAddress 부분에 추가 한 때문에이를 알고 있다면 필드가 양식에서 비어있는 경우 회사 주소를 클라이언트가있는 곳에 할당하고 관련 필드에 저장합니다. 나는 partialView을 만들려고 한

(이 땅 그냥, 비록 문제가되지 않습니다) 컨트롤러

[HttpGet] 
    public PartialViewResult AddressPartial() 
    { 
     return PartialView("_AddressPartial"); 
    } 

에 내 edit.aspx에서 나는

$(document).ready(function() { 
    $('#Not_Contact_Address').click(function (e) { 
     if ($('#Not_Contact_Address').is(':checked')) { 

      $('#dialog').dialog({ 
       autoOpen: false, 
       width: 400, 
       resizable: false, 
       title: 'Add Address', 
       modal: true, 
       open: function(event, ui) { 
       //Load the AddressPartial action which will return 
       // the partial view _AddressPartial 
        $(this).load("@Url.Action("AddressPartial")"); 
       }, 
       buttons: { 
        "Save": function() { 
         $('#dialog').dialog('close'); 
        }, 
        "Cancel": function() { 
         $('#dialog').dialog('close'); 
        } 
       } 
      }); 

      $('#dialog').dialog('open'); 
     } 
    }); 
}); 

기본적으로 사용자가 라디오 버튼을 선택하고 주소 추가 대화 상자가 나타나면 사용자가 해당 정보를 추가 한 다음이 정보를 라디오 엉덩이 아래의 양식에 다시 표시하기를 원합니다. on을 선택하면 계속 진행할 수 있고 Submit 버튼을 한번 완료하면 모든 정보를 데이터베이스에 바로 저장할 수 있습니다. (위의 컨트롤러에 표시됨).

<fieldset> 
    <legend>Main Contact Details</legend> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Contact.Title) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Contact.Title) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Contact.FirstName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Contact.FirstName) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Contact.LastName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Contact.LastName) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Contact.Email) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Contact.Email) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Contact.Phone) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Contact.Phone) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Contact.Mobile) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Contact.Mobile) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.ContactType.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.ContactType.ContactTypeID, Model.ContactSelectList, " --- Select One --- ", null) 
    </div> 

    <b>Contact Address</b> same as <b>Company Address</b> @Html.RadioButton("Not_Contact_Address", "Yes") Yes @Html.RadioButton("Not_Contact_Address", "No") No 
</fieldset> 

문제

나는 괜찮 대화 상자를 열 수 있지만, 나는 오른쪽 상단 모서리에있는 X를 클릭하여 대화 상자를 취소 할 수 있으며,이 후 내 전체 양식을 지 웁니다 및 왼쪽 빈 페이지, 내가 원하는 것은 아닙니다.

양식을 가지고있는 가장 좋은 방법은 사용자가 양식에 정보를 입력하고 페이지에 다른 양식을 표시하여 주소를 추가하고 내가 가진 viewModel에 저장 한 다음 사용자가 계속해라.

이 나를 지금 새 창에서 정보를 저장하고 내 화면으로 다시 돌아갈 수 있습니다

function openProductEditDialog() { 

    $("#ProductDetailsDialogDiv").html(""); 

    $.ajax({ 
     type: "GET", 
     url: encodeURI('@Url.Action("AddressPartial", "Home")'), 
     cache: false, 
     dataType: 'html', 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      $("#ProductEditDialogDiv").html(XMLHttpRequest.responseText); 
     }, 
     success: function (data, textStatus, XMLHttpRequest) { 
      $("#ProductEditDialogDiv").html(data); 
     }, 
     complete: function (XMLHttpRequest, textStatus) { 

      $('#ProductEditDialogDiv').dialog({ 
       width: '500px', 
       modal: true 
      }); 
     } 
    }); 
} 

업데이트, 어떤 아이디어는 메인 페이지에이 뷰 모델을 저장하는 방법은 다음과 같습니다. AddressPartial을 폼과 함께 수행 할 수 있고 어떤 정보도 잃지 않도록 호출 된 CreateClient 페이지에서 내 viewModel에 넣길 원합니다.

컨트롤러에서이 점을 지적하고 ContactAddress를 사용하여 viewModel을 다시 CreateClient 페이지로 다시 보내야한다고 생각합니다. 지금이 작업.

+0

같은 페이지에 있으므로 모달 정보를 가져 와서 원래 형식으로 저장하는 것이 가장 쉽지 않을까요? – Maffelu

+0

잘 모름, 사용자로부터 정보를 얻는 방법은 무엇입니까?사용자가 연락처 주소를 추가하면 해당 부분을 표시하는 양식의 숨겨진 부분을 만드시겠습니까? – Nathan

+0

데이터를 표시하거나 표시하십시오. 또 다른 해결책은 모달에 ajax 요청을 사용하여 주소를 저장 한 다음 숨겨진 필드에 주소 키를 저장하는 것입니다. – Maffelu

답변

0

Ajax 요청으로 주소를 저장하고 키를 리턴 할 수 있습니다. 그런 다음 원본 양식의 숨겨진 입력 상자에 키를 저장하십시오.