Обновить выбранную строку Entity Framework MVC 3

Я хочу иметь возможность выбрать строку в таблице (которая представляет собой счет-фактуру), выбрать переключатель, у которого есть значение суммы, и нажать «Подтвердить». После нажатия кнопки подтверждения я хочу, чтобы статус выбранного счета изменился на «Оплачен» или «Частично оплачен» в зависимости от выбранной суммы платежа. Я также хочу, чтобы в таблицу ClientPayments была добавлена ​​новая запись о платеже, связанная с выбранным счетом, я хочу, чтобы PaymentAmount была суммой переключателя, а дата - системной датой.

Код, который у меня есть на данный момент, выдает ошибку, а именно: словарь параметров содержит пустую запись для параметра 'id' не допускающего значения NULL типа 'System.Int32'.

Вот код, который у меня есть. В представлении:

@using (Html.BeginForm("Confirm", "InvoiceController"))
{

foreach (var item in Model)
{
string selectedRow = "";
if (item.InvoiceNumberID == ViewBag.InvoiceNumberID)
{
    selectedRow = "selectedRow";
} 

<tr class="@selectedRow" valign="top">
            <td> 
           <a href='javascript:void(0)' class='select' [email protected]     >Select</a>


        </td> 
     <td>
        @Html.DisplayFor(modelItem => item.InvoiceNumberID)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.InvoiceAmount)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.InvoiceMonth)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.InvoiceStatus)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Client.FullName)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id = item.InvoiceNumberID }) |
        @Html.ActionLink("Details", "Details", new { id = item.InvoiceNumberID }) |
        @Html.ActionLink("Delete", "Delete", new { id = item.InvoiceNumberID })
    </td>
</tr>
}
<input type='hidden' id='id' name='id' value='0' />
}
</table>
<br />

<p><i>Select or type in a custom amount to confirm as paid:</i>
</p>
<table>
<tr><td><b>Monthly Amounts:</b></td><td><b>Weekly Amounts:</b></td></tr>
<tr><td>Private Lesson (1 Hour) @Html.RadioButton("InvoiceAmount", "640", true) R640.00<br  /></td><td>Private Lesson (1 Hour) @Html.RadioButton("InvoiceAmount", "160", true) R160.00<br /> </td></tr>
<tr><td>Private Lesson (1/2 Hour) @Html.RadioButton("InvoiceAmount", "350", true) R350.00<br  /></td><td>Private Lesson (1 Hour) @Html.RadioButton("InvoiceAmount", "87.50", true) R87.50<br  /></td></tr>
<tr><td>Group Lesson (1 Hour) @Html.RadioButton("InvoiceAmount", "460", true) R460.00</td>  <td>Private Lesson (1 Hour) @Html.RadioButton("InvoiceAmount", "115", true) R115.00<br /></td> </tr>
<tr><td>Custom Amount @Html.RadioButton("InvoiceAmount", "115", true)  @Html.TextBox("customAmount")<br /></td></tr>
</table>

<script type='text/javascript'>
    $('.select').click(function(){
            $('#id').val($(this).attr('data-id'));
                 alert($('#id').val());
             });
</script>


Подтвердите оплату

И код в контроллере:

    public ActionResult Confirm(int id, long InvoiceAmount)
    {
        Invoices invoices = db.Invoice.Find(id);
        //now validate that if the logged in user is authorized to select and confirm this invoice or not.


        if (InvoiceAmount != invoices.InvoiceAmount)
        {
            invoices.InvoiceStatus = "Partly Paid";

        }
        else
        {
            invoices.InvoiceStatus = "Confirmed";
        }
        db.Entry(invoices).State = EntityState.Modified;
        db.SaveChanges();

        return View();
    }

В предупреждении javascript отображается правильный ID, который я выбираю, но когда я нажимаю "Подтвердить", он не находит ID. Может ли кто-нибудь увидеть, где я ошибаюсь?

Спасибо Эми


person Amy    schedule 05.09.2011    source источник
comment
Как выглядит элемент, содержащий атрибут id, который вы выбрали с помощью $ ('# id')?   -  person Major Byte    schedule 05.09.2011
comment
Элементом должна быть любая строка, выбранная при нажатии ссылки «Выбрать». Нравится ‹td› ‹a href='javascript:void(0)' class='select' [email protected] ›Выберите ‹/a› ‹/td›   -  person Amy    schedule 05.09.2011
comment
Таким образом, 'id' должен возвращать InvoiceNumberID выбранной строки   -  person Amy    schedule 05.09.2011
comment
Прошу прощения за свой вопрос, похоже, что браузер Opera, который я использую на своем телефоне Android, делает неверный рендеринг предоставленного Html. 80% кода просмотра не отображается.   -  person Major Byte    schedule 05.09.2011
comment
Где в коде для представления, которое вы даете, находится ваша кнопка отправки? или как иначе отправить форму? Я только что протестировал его (поместив кнопку отправки внутри формы), и код работает нормально.   -  person Major Byte    schedule 05.09.2011
comment
Внизу страницы (по какой-то причине он не появился здесь в блоке кода) у меня есть: ‹a href='@Url.Action(Confirm, Invoice)'› ‹img src = '@ Url .Content (~ / Content / buttons / confirmmpmtbtn.png) 'alt =' Подтвердить платеж '/ ›‹/a›. Так что это ссылка на действие, а не кнопка, и ее нет в форме. Может быть, поэтому он не работает?   -  person Amy    schedule 05.09.2011
comment
Если это выходит за рамки вашей формы, то, вероятно, причина в этом, да.   -  person Major Byte    schedule 05.09.2011
comment
Но могу ли я по-прежнему использовать Action в форме или это должна быть кнопка с типом ввода = submit?   -  person Amy    schedule 05.09.2011
comment
Это либо; а) кнопку отправки, б) ссылку на действие (Url.Action), которую вам нужно будет изменить с помощью javascript, чтобы применить параметр id (не самый лучший способ сделать это) или в) использовать jquery $. ajax ()   -  person Major Byte    schedule 05.09.2011
comment
Ага, теперь понятно :) Так что мне тоже пришлось перенести все переключатели в форму. Спасибо! Теперь это работает. Не могли бы вы быстро сказать мне, что я бы добавил в контроллер, чтобы добавить новую запись для платежа? (Которая относится к выбранному счету-фактуре). Статус счета-фактуры изменился на «Подтвержден». Но я также хочу добавить новую запись в таблицу ClientPayments, и я никогда раньше не делал этого с MVC.   -  person Amy    schedule 05.09.2011


Ответы (1)


1) Чтобы обратная передача работала, вам необходимо правильно отправить свою форму, например, иметь кнопку отправки внутри вашей формы;
2) Для добавления новой записи в таблицу ClientPayments вы делаете что-то в строке

if (InvoiceAmount != invoices.InvoiceAmount)
{
    invoices.InvoiceStatus = "Partly Paid";
}
else
{
    invoices.InvoiceStatus = "Confirmed";
}
db.Entry(invoices).State = EntityState.Modified;

var clientPayment = new ClientPayment();
// Set clientPayment properties
db.ClientPayments.Add(clientPayment);

db.SaveChanges();
person Major Byte    schedule 05.09.2011
comment
Большое спасибо! Еще один вопрос - как мне установить PaymentDate на текущую системную дату? Есть ли простой способ сказать clientPayment.PaymentDate = сортировать текущую дату? - person Amy; 05.09.2011
comment
Здесь вы можете найти дополнительную информацию - person Major Byte; 05.09.2011
comment
Я имею в виду clientPayments.PaymentDate = systemdate? Я не понимал, что звездочки делают странное форматирование - person Amy; 05.09.2011
comment
DateTime.UtcNow или DateTime.Now - person Major Byte; 06.09.2011