2011-12-01 4 views
4

레코드 목록을 렌더링하는 뷰가 있습니다. 하나의 열은 ID (SynchronizationID)입니다. 다른 항목은 ID 열과 연결된 "btnUpdate"를 포함하는 동적으로 생성 된 ID가있는 버튼입니다. 그것은 완벽하게 작동합니다.버튼에서 렌더링 된 부분 뷰에서 모델 생성자에 recordId를 전달하는 방법

@foreach (var item in Model.PendingSynchronizations) 
{ 
    <tr> 
     <td> 
      @item.SynchronizationID 
     </td> 
     <td> 
      @item.CustomerName 
     </td> 
     <td> 
      @item.ProductName 
     </td> 
     <td> 
      @String.Format("{0:g}", item.LastProcessedDate) 
     </td> 
     <td> 
      @item.OLAPServer 
     </td> 
     <td> 
      @item.OLAPDatabase 
     </td> 
     <td> 
      <input id="@String.Format("btnUpdate{0}",item.SynchronizationID.ToString())" type="submit" value="@String.Format("{0}", (item.ApprovedFlag) ? "Reject" : "Approve")" synchId="@item.SynchronizationID.ToString()"/> 
     </td> 
     <td> 
      @item.ApprovedSynchDate 
     </td> 
    </tr> 
} 

내가 완벽하게 작동 내 클릭 이벤트에 버튼을 결합하는 JQuery와 선택기가 : 여기

는 격자로 목록을 렌더링하는 뷰의 부분이다.

function promptForSynchDate() { 
    $('#approve-synch').dialog({ 
     modal: true, 
     height: 300, 
     width: 450, 
     title: 'Approve Production Synchronization ', 
     buttons: 
     [ 
      { text: "Approve", click: approveSynch }, 
      { text: "Cancel", click: function() { $(this).dialog("close"); } } 
     ] 
    }); 
} 


function approveSynch() { 
    $('#approveSynchForm').submit(); 
} 

function updateComplete() { 
    alert('Production Synch Approved'); 
    window.location.reload(); 
} 

모달 하나의 필드도 완벽하게 작동 날짜를 필요가있는 부분 뷰를 렌더링 다음과 같이 클릭 이벤트뿐만 아니라 승인 및 취소 버튼을 처리하는 버튼 이벤트입니다. 그러나 날짜를 입력하고 수락 단추를 클릭하면 컨트롤러는 날짜 필드가 채워진 모델을 생성자에게 다시 전달합니다.이 날짜 필드는 컨트롤러의 날짜 필드에 SET() 메서드를 호출하여 수행됩니다. 그러나 ID 필드 I 업데이트가 필요하면 여기에 항상 0

있는 부분이다 :..

@model CubeBuilder.Site.Models.ProductionSynchDateModel 
@using (Html.BeginForm("ToggleApprove", "Synchronization", new { id = Model.SynchronizationId }, FormMethod.Post)) 
{ 
    @Html.LabelFor(model => model.SynchronizationId); 
    @Html.DisplayFor(model => model.SynchronizationId); 
    @Html.LabelFor(model => model.SyncDate); 
    @Html.TextBoxFor(model => model.SyncDate, new { @class = "datepicker" })   
} 

<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".datepicker").datepicker(); 
    }); 
</script> 

실제로이 형태로 SynchronizationId 필요하지 않습니다 그것은 디버그 목적으로 만이 그냥 날짜가 필요합니다. 그러나 생성자가 호출 될 때 데이터베이스에서이 레코드를 업데이트 할 수 있도록 동기화 ID가 필요합니다.

Followin g는 부분보기위한 Ajax 호출입니다 : 내가 생각할 수있는 모든 것을 시도

<div id="approve-synch"> 
@using (Ajax.BeginForm("ToggleApprove", "Synchronization", new AjaxOptions() { 
    OnFailure = "updateSynchFailed", 
    OnSuccess = "updateComplete", 
    InsertionMode = InsertionMode.Replace, 
    UpdateTargetId = "approve-synch-form" }, 
    new { id = "approveSynchForm" })) 
{ 
<div id="approve-synch-form"> 
@Html.Partial("ApproveSynch", new CubeBuilder.Site.Models.ProductionSynchDateModel()) 
</div> 
} 
</div> 

, 그것은 단지 내가 나를 들고 MVC에 비교적 새로운 오전이 될 수 있다고 쉽게 인정됩니다.

grealy가 도움이 될 것입니다.

UPDATE :이 디버깅을 계속 따라 다음과 같이

, 나는 내가 버튼을 클릭 이벤트에서 설정 CurrentSynchId라는 기록의 목록보기에 숨겨진 필드를 추가 :

$('#CurrentSynchId').val($(this).attr('synchId'));

@Html.EditorFor(model => model.SynchronizationId); 

을 그리고 마지막으로 설정 :

내가 내 부분보기, 다음 줄을 추가하면 그 때 나는 확실히 원하지 않는 작동 모달에 제출 버튼에 대한 내 제출 단추 처리기에 모델의 프로퍼티의 값 : 다시

public class ProductionSynchDateModel 
{ 
    public short SynchronizationId { get; set; } 
    public Synchronization synchInstance { get; set; } 
    private SynchronizationManager synchManager { get; set; } 

    public bool Approved 
    { 
     get; 
     set; 
    } 

    [Required] 
    [Display(Name = "Production Sync Date")] 
    public DateTime? Schedule 
    { 
     get; 
     set; 
    } 

    [Display(Name = "Production Sync Date")] 
    public string SyncDate 
    { 
     get 
     { 
      if (Schedule.HasValue) 
       return Schedule.Value.ToShortDateString(); 

      return string.Empty; 
     } 
     set 
     { 
      Schedule = Convert.ToDateTime(value); 
     } 
    } 

    public ProductionSynchDateModel() 
    { 
    } 

    public ProductionSynchDateModel(short id) 
    { 
     var db = EntityContext.New; 
     SynchronizationId = id; 

     synchManager = new SynchronizationManager(db); 
     synchInstance = synchManager[SynchronizationId]; 
    } 
} 

:

$('#SynchronizationId').val($('#CurrentSynchId').val()); 

을 여기에 도움이 경우 부분 뷰의 모델입니다 , 어떤 도움이 될 것입니다. 나는 내가 여기에서 일종의 일을 우연히 발견 한 것처럼 느껴진다. 왜 그런지 모르겠다. 부분보기에서 EditorFor() 도우미 호출을 제거하면 작동하지 않습니다.

업데이트 다시 : Nevermind. 나는 그것을 알아 냈고 나는 그 이유를 이해합니다.EditorFor() 도우미를 HiddenFor()로 변경했습니다.이 뷰는 뷰에서 부분 뷰로 푸시되고 부분 뷰의 경우 모델에 유지되도록 저장됩니다. 모두 괜찮습니다.

같은 문제가있는 다른 사람이이 문제를 해결할 수 있기를 바랍니다. 그것은 기본적으로 버튼과 모달로 그리드를 수행하는 방법이며 잘 작동합니다.

답변

0

그것은 나를 위해 작동

@ Html.HiddenFor (모델 => model.SynchronizationId)

관련 문제