【问题标题】:Model is null with Html.BeginForm() ASP.NET MVC模型为空,带有 Html.BeginForm() ASP.NET MVC
【发布时间】:2014-10-02 11:54:27
【问题描述】:

我遇到了以下问题:
用户访问站点,单击“添加”,然后将其发送回控制器,检索模型并再次发送到视图。内部视图,我检查模型是否不为空 并显示数据。

@if (Model != null)
    {
        <div id="appInfo">
            <table>
                <tr>
                    <th>@Html.DisplayNameFor(x => Model.tytul)</th>
                    <th>@Html.DisplayNameFor(x => Model.kategoria.nazwa)</th>
                    <th>@Html.DisplayNameFor(x => Model.liczba_ocen)</th>
                    <th>@Html.DisplayNameFor(x => Model.avg_ocena)</th>
                    <th>@Html.DisplayNameFor(x => Model.typ)</th>
                </tr>
                <tr>
                    <td>@Model.tytul</td>
                    <td>@ViewData["kategoria"]</td>
                    <td>@Model.liczba_ocen</td>
                    <td>@Model.avg_ocena</td>
                    <td>@Model.typ</td>
                </tr>
            </table>
        </div> 
 <div>
                @using (Html.BeginForm("Confirm", "Wydawca", new { app = @Model }))
                {
                    <input type="submit" value="Cofirm it" />
                }
            </div>

在结束按钮“确认它”被创建,一旦你点击它调用确认方法,但应用程序变量始终为空。如果我将它的值设置为除 Model 之外的任何值,它就可以工作。

    [HttpPost]
    public ActionResult Confirm(aplikacja app)
    {
        ...
    }

虽然创建按钮“确认”模型不为空,但我检查了。你碰巧知道出了什么问题吗?

生成的html

   <form action="/Wydawca/Confirm?app=Adds.Models.aplikacja" method="post">      
   <input type="submit" value="Zatwierdź" />

【问题讨论】:

  • form标签渲染的html是什么? (不确定你期望 app = @Model 呈现什么)
  • Html.BeginForm 应该环绕您的所有输入元素,否则没有可发布的内容。
  • 既然你不编辑任何数据,为什么还要把整个模型post回来(而不是说将路由参数设置为模型的唯一ID)

标签: asp.net-mvc html-helper


【解决方案1】:

Html.BeginForm 应该环绕您的所有输入元素,否则它没有可发布的内容。改变你的观点:

@if (Model != null)
{
    @using (Html.BeginForm("Confirm", "Wydawca", new { app = @Model }))
    {
        <div id="appInfo">
            <table>
                <tr>
                    <th>@Html.DisplayNameFor(x => Model.tytul)</th>
                    <th>@Html.DisplayNameFor(x => Model.kategoria.nazwa)</th>
                    <th>@Html.DisplayNameFor(x => Model.liczba_ocen)</th>
                    <th>@Html.DisplayNameFor(x => Model.avg_ocena)</th>
                    <th>@Html.DisplayNameFor(x => Model.typ)</th>
                </tr>
                <tr>
                    <td> @Model.tytul</td>
                    <td>@ViewData["kategoria"]</td>
                    <td>@Model.liczba_ocen</td>
                    <td>@Model.avg_ocena</td>
                    <td>@Model.typ</td>
                </tr>
            </table>
        </div> 
        <div>
            @Html.HiddenFor(x => Model.tytul)
            @Html.HiddenFor(x => Model.kategoria.nazwa)
            @Html.HiddenFor(x => Model.liczba_ocen)
            @Html.HiddenFor(x => Model.avg_ocena)
            @Html.HiddenFor(x => Model.typ)
            <input type="submit" value="Cofirm it" />
        </div>
    }
}

【讨论】:

  • 表单中仍然没有命名元素。
  • 谢谢,终于开始工作了。有进一步解释的链接吗?
  • 您还需要了解什么?它本质上是基本的 HTML 表单。
  • 基本上我认为如果你发送模型你可以把它发回去,所以我很困惑为什么我们需要隐藏以及它如何在 post 方法中保留正确的信息?
  • 阅读在浏览器中呈现的 HTML 输出,这应该会有所帮助。
【解决方案2】:

您正在尝试将对象 (@Model) 作为路由参数 (app) 传递。路由参数应该包含标量值(int、string 等),而不是对象。在浏览器中查看生成的 HTML 源代码,看看 &lt;form action=""&gt; 被设置为什么。然后复习model binding的概念。

【讨论】:

  • 您的表单不包含任何命名元素,因此模型绑定器不会尝试绑定到您的操作方法的aplikacja app 参数。
猜你喜欢
  • 2015-03-11
  • 2020-01-31
  • 1970-01-01
  • 2017-08-22
  • 2017-05-29
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多