Данные не отправляются из просмотра в контроллер? - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь отправить объект из вида бритвы в метод контроллера в ASP. NET MVC 5. Проблема заключается в том, что объект не отправляется в контроллер. Это мой вид:

 @using Models;
@{ 
    var ListedCompanies = ViewBag.ListedCompanies as IEnumerable<Company>;
}
@model Models.Individual

<head>

</head>

<body>     
    <div style="width:70% ; float :left">
        <table id="verticalScroll" class="table table-striped table-bordered table-sm" cellspacing="0">
            <thead class="thead-dark">
                <tr>
                    <th>
                        CompanyName
                    </th>
                    <th>
                        SharePrice
                    </th>
                    <th>
                        SharesCount
                    </th>
                    <th>
                        SharesOnTheMarket
                    </th>
                    <th>
                        Details
                    </th>

                </tr>
            </thead>
            <tbody>

                @foreach (Company o in ListedCompanies)
                {
                    <tr>
                        <td>
                            @o.CompanyName
                        </td>
                        <td>
                            @o.SharePrice
                        </td>
                        <td>
                            @o.SharesCount
                        </td>
                        <td>
                            @o.SharesOnTheMarket
                        </td>
                        <td>

                            <button type="button" value="Details" class="btn btn-primary"
                                    onclick="location.href='@Url.Action("Transaction","User", new Transaction { Company = o,Individual = (Individual)Model})'">
                                Details
                            </button>

                        </td>

                    </tr>
                }

            </tbody>
        </table>
    </div>

</body>

И это метод контроллера:

    public ActionResult Transaction(Transaction Transaction)
    {
        return RedirectToAction("CompanyDetails", Transaction);
    }

Это объект транзакции:

   public class Transaction
{
    public ASK ASK { get; set; }
    public BID BID { get; set; }
    public Individual Individual { get; set; }
    public Company Company { get; set; }

}

Проблема в том, что когда я нажимаю кнопку, свойства объекта Transaction из метода контроллера становятся равными нулю. Я попытался использовать тег [HTTPPost], а также использовать форму вместо кнопки, например:

 @using (Html.BeginForm("Transaction", "User", FormMethod.Post, new Transaction {Company = o,Individual = (Individual)Model}))
   {
      <input type="hidden" name="Transaction" />
      <input type="submit" value="Transaction" class="btn btn-primary active" />
   }

Кроме того, не сработало. Я также попытался добавить метод из контроллера в RouteConfig и я иметь тот же результат.

1 Ответ

1 голос
/ 03 апреля 2020

Вы пытаетесь сериализовать целый сложный объект здесь:

onclick="location.href='@Url.Action("Transaction","User", new Transaction { Company = o,Individual = (Individual)Model})'"

Из комментария на вопрос выше, это просто запись строкового представления каждого свойства:

location.href='/User/Transaction?Individual=System.Data.Entity.DynamicProxies.Individual_38FCAB5A9CFA20BF79D8EDBDD997A0CA040A96BD2C33DAB33CB4A343BE8BDF7B&Company=System.Data.Entity.DynamicProxies.Company_5BF87B6217AD9FE8C136ECD77D64A8AE5DC9669791BB1FEA512FD500FE1CCFE4'

Сделайте шаг назад ... Зачем вам нужен весь объект здесь? Рассмотрим это концептуально на мгновение. Сервер строит весь этот объект, отправляя весь этот объект клиенту, только чтобы клиент отправил весь этот объект без изменений пользователем обратно на сервер. (Или, по крайней мере, намерение состоит в том, чтобы пользователь не изменял его. Что происходит, когда пользователь изменяет его ? Будет ли сервер доверять всему этому объекту при отправке назад?)

В конечном итоге ... Почему? Нет необходимости отправлять весь объект клиенту только для того, чтобы отправить весь объект обратно на сервер. Все, что нужно серверу, - это достаточно информации для повторного извлечения объекта из данных. Идентификатор некоторого вида. В базе данных это обычно поле первичного ключа.

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

Так какие идентификаторы вам нужны? Похоже, вы ищете только Company и Individual. Предположим для примера, что у них обоих есть свойство с именем ID, которое является единственным значением для идентификации этих записей в ваших данных. Тогда все, что вам нужно, - это идентификаторы:

onclick="location.href='@Url.Action("Transaction","User", new { companyID = o.ID, individualID = ((Individual)Model).ID }'"

Это сделает ссылку более похожей на:

location.href='/User/Transaction?companyID=123&individualID=234'

В действии на стороне сервера вы ожидаете только эти значения:

public ActionResult Transaction(int companyID, int individualID)
{
    // Fetch the records to build your Transaction object
}

Кроме того, стоит также отметить, что ваше действие в настоящее время повторно сериализует весь объект и снова отправляет его клиенту в форме перенаправления. Похоже, что здесь происходит несколько уровней косвенного обращения, и вы пытаетесь передать весь объект назад и вперед между сервером и клиентом несколько раз. Это определенно не нужно.

Сохраняйте минимальные данные между сервером и клиентом, передавайте только необходимые значения. Сервер может восстанавливать объекты из данных быстрее и надежнее, чем сеть может передавать целые объекты несколько раз, и при этом код будет проще.

...