mvc razor视图嵌套的foreach模型post null子对象

时间:2016-06-23 13:00:43

标签: asp.net-mvc post razor view nested

在我的代码中,我无法读取表单帖子上的嵌套对象值。

在一个对象中编辑List属性的Wrog方法:

 @{
        var contatore = 0;

        foreach (var item in Model.Movimenti)
        {
            var movimento = item;

            <tr>
                <td align="left">
                    @*Imposto gli Hidden per tutte le proprietà che devo recuperare al post*@
                    @Html.HiddenFor(x => movimento.Prodotto.Descrizione, "Movimenti[" + contatore + "].Prodotto.Descrizione")

                    @Html.DisplayFor(x => movimento.Prodotto.Descrizione, "Movimenti[" + contatore + "].Prodotto.Descrizione")
                </td>
                <td>@Html.EditorFor(x => movimento.Aum, "CurrencyDisabled", "Movimenti[" + contatore + "].AUM")</td>
            </tr>
            contatore++;
        }
    }

这是在一个对象中编辑List属性的正确方法:

代码:

@using AI.Business.Models
@model Operazione
@{    ViewBag.Title = "Simulatore"; }
@using (Html.BeginForm("CreaOperazione", "Operativita", FormMethod.Post))
{     
// Imposto gli Hidden per tutte le proprietà che devo recuperare al post
@Html.HiddenFor(x => x.RapportoModel.TipoRapportoId)

<table width="100%" class="display" id="Simulatore" cellspacing="0">

    <thead>
    <tr>
        <th class="dt-head-left">Linea</th>
        <th>AUM</th>
    </tr>
    </thead>
    <tbody>
        @Html.EditorFor(x => x.Movimenti)
    </tbody>

</table>
<button id="btnSalva" name="btnSalva" type="submit" style="float: right;">Salva Operazione</button>

}

编辑推荐:

@model AI.Business.Models.Movimento
<tr>
<td align="left">
@Html.HiddenFor(x => x.Prodotto.Descrizione)
@Html.DisplayFor(x => x.Prodotto.Descrizione)</td>
<td>@Html.EditorFor(x => x.Aum, "CurrencyDisabled")</td>

这是我的目标:

public class Movimento
{
    public int Id { get; set; }
    public ProdottoModel Prodotto { get; set; }
    public decimal Aum { get; set; }
}

对象产品:

public class ProdottoModel
{    
    [Key]
    public int ID { get; set; }
    public string Descrizione { get; set; }
}

在我的Actionresult中,Descrizione属性为null:

[HttpPost]
    public ActionResult CreaOperazione(Operazione operazione)
    {
        if (ModelState.IsValid)
        {
            // Do something
        }
        else
            ImpostaErrore(ModelState);

        return View("PaginaSimulatore", operazione);
    }

打开图像:
At my first access to the page the property Prodotto.Descrizione is populated

When i raise the form post event this property was sent with a null value

1 个答案:

答案 0 :(得分:1)

我不确定你是如何让这一切发挥作用的,但这完全是侥幸。例如,HiddenFor没有参数可以让您指定字段的名称值。相反,在您尝试这样做的地方,该参数实际上是htmlAttributes的参数,它需要匿名对象或IDictionary。您没有收到错误的唯一原因是因为string在技术上是object,但在此上下文中它永远不会做任何事情。

其他助手调用也是如此。特别是EditorFor,您传递"CurrencyDisabled"的第二个参数用于指定应使用的编辑器模板,第三个参数用于additionalViewData,其中只需在编辑器模板的上下文中将项目附加到ViewData

无论多么短暂,这一切都不会影响你的想法。简单而言,如果您需要使用集合,则需要使用for而不是foreach。传递给*For系列助手的表达式不仅仅是识别属性,而是可以实现它;它必须是可绑定的表达式,即Razor可以用来为表单字段创建一个名称,该名称将在帖子上排列到模型上的某些内容。为了实现这一点,名称必须类似Movimenti[N].Prodotto.Descrizione,并且唯一的方法是调用助手,如:

 @Html.HiddenFor(m => m.Movimenti[i].Prodotto.Descrizione)

i将是for循环中的迭代器。