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