MVC3不发布整个模型

我对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
}

有没有一种方法可以让我的模型仅仅传递一篇文章的描述,即使它不是来自我的模型的文本框?


将发布到您的应用程序的唯一数据是在提交的表单上提供的数据(当然,除非表单字段被禁用)。 您可以通过实施自定义模型绑定器来覆盖控制器看到的内容。

在这种情况下,您的表单由多个单个文本字段的实例组成:

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

如果你想要填写说明和其他内容,他们需要在表格中出现。 如果它们不需要可见,那么可以使用HiddenFor帮助器:

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

另请参见Html.HiddenFor做什么?


当然,你不能这样做

首先,你应该知道模型绑定基本上是使用客户端输入的数据发送。 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>
    }

这样,提交的表单也将包含描述值


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();
    }
链接地址: http://www.djcxy.com/p/10365.html

上一篇: MVC3 Not Posting entire Model

下一篇: IIS 7 Logging Web Service methods