【问题标题】:Model binding not working with labelfor模型绑定不适用于 labelfor
【发布时间】:2013-12-12 09:52:25
【问题描述】:

这是我的模型:

    public string CustomerNumber { get; set; }
    public string ShipMethod { get; set; }
    public string ContactPerson { get; set; }
    public string ShipToName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3{ get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }

这是我的部分观点:

 <table class="table table-condensed">
                <thead>
                    <tr>
                        <td>Customer Number</td>
                        <td>Ship Method</td>
                        <td>Contact Person</td>
                        <td>Ship to Name</td>
                        <td>Address 1</td>
                        <td>Address 2</td>
                        <td>Address 3</td>
                        <td>City</td>
                        <td>State</td>
                        <td>Zip</td>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>@Html.LabelFor(x => x.CustomerNumber, Model.CustomerNumber)</td>
                        <td>@Html.LabelFor(x => x.ShipMethod, Model.ShipMethod)</td>
                        <td>@Html.LabelFor(x => x.ContactPerson, Model.ContactPerson)</td>
                        <td>@Html.LabelFor(x => x.ShipToName, Model.ShipToName)</td>
                        <td>@Html.LabelFor(x => x.Address1, Model.Address1)</td>
                        <td>@Html.LabelFor(x => x.Address2, Model.Address2)</td>
                        <td>@Html.LabelFor(x => x.Address3, Model.Address3)</td>
                        <td>@Html.LabelFor(x => x.City, Model.City)</td>
                        <td>@Html.LabelFor(x => x.State, Model.State)</td>
                        <td>@Html.LabelFor(x => x.ZipCode, Model.ZipCode)</td>
                    </tr>
                </tbody>
            </table>

数据正确显示在视图中,但是当我的页面上发生帖子时,数据返回 null。我需要将那些 LabelFors 中的数据发送回我的控制器,因此我不必将其存储在会话中。我认为 MVC 应该使用 labelfors 自动绑定到您的模型。我做错了什么?

编辑

我想我问这个问题的原因是因为我刚从 webforms 转移到 MVC,没有视图状态我很迷茫。我想如果我的模型中的值不断地从视图中返回给我,我就不必将我的模型存储在会话对象中。在我的页面上,我需要能够在页面周期内持久化我的模型,这样我就可以在用户单击保存按钮后将我的模型数据存储到一些 sql 表中。有哪些选项可以将您的模型持久保存在 MVC 中?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    它只绑定表单内的输入元素(因为浏览器会发布这些)。标签未发布。

    您可以使用HiddenFor.. 因为它们是输入元素:

    @Html.HiddenFor(x => x.City)
    

    ..等等。您只是不能使用标签发送回控制器。

    LabelFor:

    <label></label> <!-- Not POST'ed by the browser -->
    

    HiddenFor:

    <input type="hidden" /> <!-- POST'ed by the browser -->
    

    【讨论】:

      【解决方案2】:

      MVC 将根据 HTML 标准工作,这意味着它不会回发标签元素。

      使用带有readonly 属性的HiddenForTextboxFor

      但是,如果您只是显示值,为什么不在将它们发送到页面之前将它们放入会话中呢?

      如果您喜欢向导样式的表单,您需要在将数据提交到数据库之前保存步骤之间的更改,例如,您最好的选择是将提交的值保存在下一步中再次读出的会话中在控制器中。否则,您可以使用值在表单上放置隐藏的输入,但这很容易被用户操纵。

      【讨论】:

      • 因为我认为将整个模型放入会话中会破坏模型绑定功能的全部目的。
      • 但是这样一来,您的模型将永远不会有任何价值,您的模型到底有什么意义?你想显示值还是接受用户的值?
      • 从我的数据库中填充模型后,此数据仅显示在视图中。我还需要将数据放入模型中吗?
      • 好吧,这就是现在发生的事情,但是您可以通过使用@Model.CustomerNumber 来简单一点,如果您在回发后再次需要这些值,您应该再次查询您的数据库以获取这些值。 MVC 不像 Webforms 的状态总是可用的,在这里你必须处理你自己的状态。
      • 我想我会使用会话。
      【解决方案3】:

      就像 Simon 和其他人解释的那样,标签不会张贴。当您想要更改某些内容时,应使用发布请求。如果您只是查看和编辑模型,则无需将其存储在会话中。


      在您看来,您需要一个链接来编辑您的模型:

      @Html.ActionLink("edit", "Edit", new {id = Model.CustomerNumber});
      


      在您的控制器中实现您的 Edit 操作方法:

      public ViewResult Edit(int customerNumber) {
          var customer = _repository.Customers.FirstOrDefault(c => c.CustomerNumber == customerNumber);
          return View(customer);
      }
      


      您将需要 Edit 操作方法的视图,并在表单中发布您的更新。

      @using (Html.BeginForm()) {
          <label>Contact Person:</label>
          <input name="ContactPerson" value="@Model.ContactPerson" />
          // the rest of your form
      
          <input type="submit" value="Save" />
      }
      


      实现处理帖子的方法。确保添加 HttpPost 属性。

      [HttpPost]
      public ViewResult Edit(Customer customer) {
          if (ModelState.IsValid) {
              // Save your customer
              return RedirectToAction("Index");
          }
          else {
              return View(customer);
          }
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2019-07-03
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 2018-06-19
        • 2015-06-27
        • 1970-01-01
        • 2016-03-30
        • 1970-01-01
        相关资源
        最近更新 更多