Проект: приведите список транзакций корпоративной карты и дайте пользователю заполнить документацию для поддержки каждой оплаты. Позвольте пользователю сохранять все изменения одновременно по сравнению с одной записью за раз.Редактирование MVC 5, EF 6 и Multirow (пакетное)
Взгляд
@using (@Html.BeginForm("Index", "CorpCardTransactions", FormMethod.Post))
{
<table>
<tr>
<th></th>
<th>Card Holder</th>
<th>Post Date</th>
<th>Transaction Date</th>
<th>Payee</th>
<th>Amount</th>
<th>Description</th>
<th>GL/Account</th>
<th>Branch Code</th>
<th>Receipt</th>
</tr>
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>@Html.HiddenFor(m => m[i].ID)</td>
<td>@Html.DisplayFor(m => m[i].AccountID)<br />
@Html.DisplayFor(m => m[i].CardHolderName)</td>
<td>@Html.DisplayFor(m => m[i].PostDate)</td>
<td>@Html.DisplayFor(m => m[i].TranDate)</td>
<td>@Html.DisplayFor(m => m[i].Payee)</td>
<td>@Html.DisplayFor(m => m[i].Amount)</td>
<td>@Html.EditorFor(m => m[i].Description)</td>
<td>@Html.EditorFor(m => m[i].GL_Account)</td>
<td>@Html.EditorFor(m => m[i].BranchCode)</td>
<td>@Html.EditorFor(m => m[i].Receipt)</td>
</tr>
}
</table>
<p><input type="submit" value="Save Changes" /></p>
<p style="color:green; font-size:12px;">@ViewBag.Message</p>
}
Обратите внимание, что у меня есть несколько ячеек «Displayfor», которые используются только отображения значений из базы данных, не позволяя пользователю изменять эти данные. Только последние 4 поля могут быть изменены или обновлены.
Контроллер
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using intranetMVC.Models;
using Microsoft.AspNet.Identity;
namespace intranetMVC.Controllers
{
public class CorpCardTransactionsController : Controller
{
private ExpenseReportingEntities db = new ExpenseReportingEntities();
public ActionResult Index(string AccountID, DateTime StatementDate)
{
//var loginName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\');
//var username = loginName.Last() + "@redcanoecu.com";
List<CorpCardTransaction> model = new List<CorpCardTransaction>();
var username = "[email protected]";
var stmtDate = StatementDate;
var q = from b in db.CorpCardTransactions
where b.Username == username && b.StatementDate == StatementDate && b.AccountID == AccountID && !b.SubmitDate.HasValue
select b;
model = q.ToList();
return View(model);
}
[HttpPost]
public ActionResult Index(List<CorpCardTransaction> list)
{
if(ModelState.IsValid)
{
using (db)
{
foreach (var i in list)
{
var t = db.CorpCardTransactions.Where(a => a.ID.Equals(i.ID)).FirstOrDefault();
if(t != null)
{
t.Description = i.Description;
t.GL_Account = i.GL_Account;
t.BranchCode = i.BranchCode;
t.Receipt = i.Receipt;
}
}
db.SaveChanges();
}
ViewBag.Message = "Successfully updated.";
return View(list);
}
else
{
ViewBag.Message = "Ooops, something went wrong. Try again.";
return View(list);
}
}
}
}
Проблема заключается в том, что, когда я вернусь «список» в целях после сохранения изменений, все поля «Displayfor» исчезают, и только текстовые поля там с изменениями, которые произошли. Как я могу получить весь вид для отображения снова, как при загрузке страницы? Я попытался включить их в оператор foreach, просто сделав их равными себе, но он не работает.
{
t.cardholdername = t.cardholdername
etc....
}
Есть ли способ сделать как Response.Redirect(), который я хотел бы использовать в WebForms вместо того, чтобы делать Return View (список)? Таким образом, он будет создавать страницу так же, как до нажатия кнопки, но она будет включать новые значения.
* Как я могу получить весь вид, который будет отображаться снова, как при загрузке страницы? * Это не веб-формы, и нет ViewState. HTTP - это протокол без учета состояния. Если вы хотите, чтобы данные были там, вам нужно будет включить их в ответ. – Yuck
Да, я понял, но я не уверен, как по существу перестроить мой стол. Можно ли снова вызвать метод Index()? – Russ668