Как передать recordId конструктору модели из частичного представления, отображаемого нажатием кнопки - PullRequest
4 голосов
/ 01 декабря 2011

У меня есть представление, которое отображает список записей.Одним из столбцов является идентификатор (SynchronizationID).Другим элементом является кнопка с динамически генерируемым идентификатором, которая включает в себя «btnUpdate», объединенный со столбцом идентификатора.Он отлично работает.

Вот часть представления, которая отображает список в виде сетки:

@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, который связывает кнопки с моим событием click, которое отлично работает,Событие щелчка, а также события кнопки, которые обрабатывают кнопки «Принять» и «Отмена», следующие:

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 () для этого поля даты контроллера. Но поле идентификатора 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 в этой форме. Он существует только для целей отладки. Я простонужна дата. Но когда вызывается конструктор, мне также нужен идентификатор синхронизации, чтобы я мог обновить эту запись в базе данных.

Ниже приведен вызов 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, который держит меня в руках.

Любая помощь будет с благодарностью оценена.* ОБНОВЛЕНИЕ:

Поскольку я продолжал отлаживать это, я добавил в представление скрытое поле со списком записей с именем CurrentSynchId, который я установил в своей кнопке click событие следующим образом:

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

Затем, если я добавлю следующую строку в свой частичный вид, который я определенно не хочу:

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

И, наконец,установите значение свойства в модели в моем обработчике кнопки отправки для кнопки отправки в модальном режиме, в котором оно работает:

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

Вот модель для частичного представления в случае, если это помогает:

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];
    }
}

Опять-таки, любая помощь будет отличной.Я чувствую себя так, словно наткнулся на что-то, что здесь работает, и я не знаю почему.Если я удалю этот вспомогательный вызов EditorFor () из частичного представления, он не будет работать.

ВНОВЬ ОБНОВЛЕНО: Неважно.Я понял это и понимаю почему.Я изменил помощник EditorFor () на HiddenFor (), который заставляет поле перемещаться из вида в частичный вид и сохраняется в модели для частичного вида.Все в порядке.

Я надеюсь, что кто-то другой, имеющий такую ​​же проблему, может получить некоторые из этого.Это в основном способ сделать сетку с кнопками и модалами и хорошо работает.

1 Ответ

0 голосов
/ 09 декабря 2011

у меня работает

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...