MVC3 не публикует всю модель - PullRequest
7 голосов
/ 24 января 2012

Я довольно новичок в MVC и действительно пытаюсь привыкнуть к привязке модели.У меня есть простая модель, которую я создал в форме.Однако, когда я публикую эту форму, ТОЛЬКО значения текстового поля переносятся на контроллер.Мне нужно поле описания также, что делается с помощью DisplayTextFor.Это то, что я собираюсь сделать для связующего по индивидуальному заказу?Я мог бы использовать ярлык и сделать описание доступным только для чтения, без рамки, чтобы оно выглядело как текст, но я хочу сделать это правильно.Вот мой код:

public class FullOrder
{
    public List<FullOrderItem> OrderList { get; set; }
    public string account { get; set; }
    public string orderno { get; set; }
}

public class FullOrderItem
{
    public int? ID { get; set; }
    public int? OrderId { get; set; }
    public string Description { get; set; }
    public int Qty { get; set; }
    public decimal? Price { get; set; }
}

Вот вид

<table class="ExceptionAltRow">
    <tr style="background-color: #DDD;">
        <td class="strong" style="width:500px;">
            Description
        </td>
        <td class="strong" style="width:100px;">
            Qty
        </td>
        <td class="strong" style="width:100px;">
            Previous Purchases
        </td>
    </tr>
    @for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++)
    {
        <tr>
            <td>
                @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description)
            </td>
            <td>
                @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" })
            </td>
        </tr>
    }
    </table>

Вот контроллер:

[HttpPost]
public ActionResult AddItem(FullOrder f)
{
    //doesn't work description is not passed but qty is
}

Есть ли способ получить мойМодель просто передать описание поста, даже если это не текстовое поле для связанного элемента из моей модели?

Ответы [ 3 ]

2 голосов
/ 24 января 2012

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

В этом случае ваша форма состоит из множества экземпляров одного текстового поля:

@Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" })

Если вы хотите, чтобы описание и другие вещи были заполнены, они должны присутствовать в форме.Если они не должны быть видимыми, то вы можете использовать помощник HiddenFor:

@Html.HiddenFor(m => m.FullOrder.OrderList[i].Description)

См. Также Что делает Html.HiddenFor?

1 голос
/ 24 января 2012

Конечно, вы не можете заставить это работать таким образом

Во-первых, вы должны знать, что привязка модели происходит в основном с использованием данных, отправляемых со входов на стороне клиента.Html.DisplayTextFor Помощник не генерирует ввод, он генерирует простой текст.Тексты не участвуют в данных, отправляемых клиентом при отправке формы, поэтому вы не получите привязку к модели.Если вы посмотрите на свойство Request.Form, вы должны увидеть доказательство - там нет полей описания.

Что вы можете сделать, если хотите отображать текст, а также позволить описанию участвовать в значениях формы, этоиспользовать скрытое поле.MVC получил помощника для этого

 @for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++)
    {
        <tr>
            <td>
                @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description)
                @Html.HiddenFor(m => m.FullOrder.OrderList[i].Description)
            </td>
            <td>
                @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" })
            </td>
        </tr>
    }

Таким образом, отправленная форма также будет содержать значения описания

0 голосов
/ 24 января 2012

Функция DisplayTextFor собирается только выводить этот текст в DOM браузера. Привязка каркаса MVC в основном рассматривает переменные POST / GET и автоматически устанавливает эти значения в вашей модели.

Если вы хотите автоматически связать какие-либо данные (например, текст вашего описания), вам придется сохранить их в каком-либо типе ввода и / или скрытом поле. Скрытые поля работают, но неэффективны, так как вы помещаете кучу дополнительных элементов в ваш HTML и даже могут быть отредактированы пользователем с помощью чего-то вроде Firebug.

Моя рекомендация и то, что я всегда делал, состоит в том, чтобы ожидать, что некоторая часть этой информации не будет отправлена ​​обратно, а просто установить ее явно в действии контроллера:

 [HttpPost]
    public ActionResult AddItem(FullOrder f)
    {
         // Next line is just showing that you should get the existing order
         // from your data layer
         FullOrder existingOrder = orderRepository.GetExistingOrder();

         // Now loop through f.OrderList and update the quantities
         foreach(OrderItem item in f.OrderList) {
             // Find the existing item and update the quantity.
         }

         // Now you have the original information from the DB along with
         // updated quantities.

         // Save results or do whatever is next
         existingOrder.Save();
    }
...