【问题标题】:mvc razor view nested foreach model post null subobjectmvc razor 视图嵌套 foreach 模型发布空子对象
【发布时间】:2016-06-23 13:00:42
【问题描述】:

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

在一个对象中编辑 List 属性的错误方式:

 @{
        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++;
        }
    }

这是在一个 Object 中编辑 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 为空:

[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

【问题讨论】:

  • 在表单帖子中,我可以正确读取属性 AUM,但不能正确读取为 null 的属性 Prodotto.Descrizione。
  • 您不能使用 foreach 循环为集合生成表单控件 - 请参阅 this answer
  • 如果你得到一个NullReference 异常,那是因为Prodottonull
  • Prodotto 有一个价值,当我在我的 actionresult 中提出表单发布时,Prodotto 为空
  • 因为你不能使用foreach 循环 - 请阅读我给你的链接。

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


【解决方案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 循环的迭代器。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2013-08-24
    • 2017-01-15
    • 2017-04-10
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多