3

Проект: приведите список транзакций корпоративной карты и дайте пользователю заполнить документацию для поддержки каждой оплаты. Позвольте пользователю сохранять все изменения одновременно по сравнению с одной записью за раз.Редактирование 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 (список)? Таким образом, он будет создавать страницу так же, как до нажатия кнопки, но она будет включать новые значения.

+0

* Как я могу получить весь вид, который будет отображаться снова, как при загрузке страницы? * Это не веб-формы, и нет ViewState. HTTP - это протокол без учета состояния. Если вы хотите, чтобы данные были там, вам нужно будет включить их в ответ. – Yuck

+0

Да, я понял, но я не уверен, как по существу перестроить мой стол. Можно ли снова вызвать метод Index()? – Russ668

ответ

1

@Html.DisplayFor не будет создавать элемент ввода на странице, поэтому значения не будут отправляться обратно на сервер. Добавьте @Html.HiddenFor для каждого из них, и они делают его обратно вверх:

... 
<td> 
    @Html.DisplayFor(m => m[i].PostDate) 
    @Html.HiddenFor(m => m[i].PostDate) 
</td> 
<td> 
    @Html.DisplayFor(m => m[i].TranDate) 
    @Html.HiddenFor(m => m[i].TranDate) 
</td> 
... 

Или, если вы сохранили StatementDate, вы можете просто вызвать ваше возвращение вашего Index метода с этими параметрами. Я бы взял такой подход. Это проще, меньше кода, и он чувствует себя более «правильным».

+1

Это прекрасно и точно, что я не понимал. Я добавил HiddenFor для достижения одного, и он сработал !!! Очень ценит Джонни. – Russ668

Смежные вопросы