У меня есть представление только для чтения MVC3, содержащее таблицу, в которой отображаются свойства элемента.
Для многих свойств Предмета мы отслеживаем изменения, внесенные Продавцом в предмет. Так, например, поставщик может обновить свойство с именем «Color» со значения «Blue» до «Red». В этом представлении таблица перечисляет каждое свойство, отслеживаемое в строке таблицы, в столбце показаны «Старое значение» и «Новое значение». В следующем столбце отображается состояние текущего изменения (в ожидании утверждения, одобрено или отклонено). Однако для пользователей с правами администратора столбец будет содержать ссылки («Одобрить», «Отклонить» или «Сбросить в ожидании утверждения»).
Мой код разметки и Razor для этого очень повторяется и выходит из-под контроля. Я хотел бы создать для этого HTMLHelper или, возможно, частичное представление, которое можно использовать для перемещения всего кода, а затем использовать его для каждого свойства элемента.
Вот пример кода, используемого для одного свойства. Этот код повторяется для еще 10 или около того свойств.
Я использую некоторые jquery и ajax для действий. Например, когда изменение отклонено, пользователь должен ввести причину отклонения изменения.
<tr id="rowId-color">
<td>@Html.LabelFor(model => model.Color)</td>
<td>@Html.DisplayFor(model => model.Color)</td>
@if (Model.ChangeLog != null && Model.ChangeLog.Item("Color") != null) {
var change = Model.ChangeLog.Item("Color");
var changeStatus = (ItemEnumerations.ItemChangeStatuses)change.ItemChangeStatusID;
<td>@change.OldValueDisplay</td>
<td id="tdstatusId-@change.ItemChangeID">
@if (changeStatus == ItemEnumerations.ItemChangeStatuses.AwaitingApproval && User.IsInRole("TVAPMgr")) {
@Ajax.ActionLink("Approve", "Approve", new { itemChangeID = change.ItemChangeID }, new AjaxOptions { HttpMethod = "POST", Confirm = "Approve this change?", OnSuccess = "actionCompleted" })
@Html.Raw("|")
<a href="#dialog" name="reject" data-id="@change.ItemChangeID" >Reject</a>
}
else if ((changeStatus == ItemEnumerations.ItemChangeStatuses.Rejected || changeStatus == ItemEnumerations.ItemChangeStatuses.Approved) && User.IsInRole("TVAPMgr")) {
@Ajax.ActionLink("Reset to Awaiting Approval", "Reset", new { itemChangeID = change.ItemChangeID }, new AjaxOptions { HttpMethod = "POST", Confirm = "Reset this change to Awaiting Approval?", OnSuccess = "actionCompleted" })
}
else {
@changeStatus.ToDisplayString()
}
</td>
<td id="tdreasonId-@change.ItemChangeID">@Html.DisplayFor(m => m.ChangeLog.Item(change.ItemChangeID).RejectedReason)</td>
}
else {
<td colspan="3">No Change</td>
}
</tr>