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