Как получить доступ к определенным строкам и вставить значения в определенные столбцы таблицы? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть базовая модель:

public class Events
{
    public int Id { get; set; }
    public string title { get; set; }
    public string amount { get; set; }
    public string Finance_Approval { get; set; }
}

Я хочу подключить два разных контроллера к одному представлению, один для запрашивающих, которые могут заполнять только поля заголовка и суммы. И второй контроллер для Финансового менеджера, чтобы утвердить запрос, заполнив поле Finance_Approval в таблице.

Я создал два контроллера и их бритвенные виды следующим образом:

Контроллер запросов:

   public ActionResult Index()
    {
        return View();
    }

    public ActionResult Request(Events e)
    {
        _context.evt.Add(e);
        _context.SaveChanges();

        return Content("Added");
    }

Это Razor View:

@using (Html.BeginForm("Request", "Requester"))
{
<div class="form-group">
    @Html.LabelFor(a => a.title)
    @Html.TextBoxFor(a => a.title, new { @class = "form-control" })
</div>
<div class="form-group">
    @Html.LabelFor(a => a.amount)
    @Html.TextBoxFor(a => a.amount, new { @class = "form-control" })
</div>

<button class="btn btn-primary">Request</button>
}

А это финансовый контролер:

  public ActionResult Index()
    {

        return View();
    }

    public ActionResult Approve(Events e)
    {

        _context.evt.Add(e);
        _context.SaveChanges();
        return Content("Approved!");
    }

А это его бритва:

@using (Html.BeginForm("Approve", "Finance"))
{

<div class="form-group">
    @Html.LabelFor(a => a.Finance_Approval)
    @Html.TextBoxFor(a => a.Finance_Approval, new { @class = "form-control" })
</div>

<button class="btn btn-primary">Approve</button>
 }

Теперь, основываясь на проектах вида бритвы для обоих контроллеров, Запрашивающая сторона может вставить в два предопределенных поля, которые являются заголовком и суммой, как и финансовый менеджер, который является только полем Finance_Approval.

Но проблема в том, что всякий раз, когда финансовый менеджер одобряет запрос от своего портала, допустим, с некоторым значением, как «Да», тогда это значение вставляется в совершенно новую строку, которая не имеет никакого отношения к строкам, заполненным запрашивающие.

Я хочу, чтобы финансовый менеджер мог утверждать строки, которые имеют какое-то значение (которые заполнены запросчиками), но я не могу понять логику.


@ erShoaib Вот последние обновления:

  public ActionResult Index()
    {

        var all = _context.evt.ToList();
        return View(all);

    }

    public ActionResult Details(int? Id)
    {
        if (Id == 0)
        {
            return HttpNotFound();
        }

        var evtt = _context.evt.Find(Id);

        return View(evtt);
    }

    public ActionResult Approve(Events e)
    {
        if (e==null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Events evt = _context.evt.Find(e.Id);
        evt.Finance_Approval = e.Finance_Approval;

        //_context.evt.Add(e);
        _context.SaveChanges();
        return Content("Approved!");
    }

Это полный индекс:

   @model IEnumerable<InsertFromdifferentControllers.Models.Events>

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<table class="table table-bordered table-hover">
@foreach (var item in Model)
{

  <tbody>
      <tr>
          <td>@item.Id</td>
          <td>@item.title</td>
          <td>@item.amount</td>
          <td>@Html.ActionLink("Expand","Details","Finance", new { Id = 
  @item.Id},null)</td>
      </tr>
  </tbody>

  }

 </table>

И это представление для деталей:

@model InsertFromdifferentControllers.Models.Events

<table class="table table-bordered table-hover table-responsive">


<tbody>
    <tr>
        <td>@Model.Id</td>
        <td>@Model.title</td>
        <td>@Model.amount</td>
        @using (Html.BeginForm("Approve","Finance"))
        {
            <div class="form-group">
                @Html.LabelFor(a=> a.Finance_Approval);
                @Html.TextBoxFor(a=> a.Finance_Approval, new { @class="form-control"})
            </div>
            <button class="btn btn-primary">Save</button>
        }
    </tr>
</tbody>

1 Ответ

0 голосов
/ 01 ноября 2018

Ваш Requester Controller и его View были идеальными, значит, заявитель успешно добавил новую запись в БД.

Например: title = "Abc", amount="123" и после добавления этой записи предположим, что id было 10

Теперь в Finance Controller вам нужно получить вышеупомянутую запись в Index методе, таком как

public ActionResult Index(int id=0)                 <=  Pass "id=10"
{
   if(id == 0)
   {
     return HttpNotFound();
     //or code to handle request when id = 0
   }

   Events events = _context.evt.Find(id);           <= The "Find" function can get record with id=10
   return View(events);                             <= Pass found record to view.
}

После изменения, сделанного финансовым менеджером в Finance_Approval поле вышеуказанной записи с id равно 10

Например: Finance_Approval = "Approved". Затем все поля записи с этим новым полем могут быть отправлены в Approve метод действия в Finance Controller.

А потом вам нужно обновить вышеуказанную запись как

public ActionResult Approve(Events e)               <= Now "e" contains id=10, title="Abc", amount="123" and Finance_Approval="Approved"
{
    if(e == null)
    {
         return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    Events events = _context.evt.Find(e.id);        <= Fetch record of id=10 from database.
    events.Finance_Approval = e.Finance_Approval;   <= Assign changes to found record with posted data from view.
    _context.SaveChanges();
    return Content("Approved!");
}
...