【问题标题】:How are forms prepopulated in ASP.Net MVC?如何在 ASP.Net MVC 中预填充表单?
【发布时间】:2009-05-30 21:09:33
【问题描述】:

当您有一个由 Html.BeginForm() 创建的 ASP.Net MVC 表单时,如何填充其中的字段?在

的情况下
<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">
<h2>Edit Dinner</h2>
<%= Html.ValidationSummary("Please correct the errors and try again.") %>
<% using (Html.BeginForm()) { %>
   <p>
       <label for="Title">Dinner Title:</label>
       <%= Html.TextBox("Title") %>
       <%= Html.ValidationMessage("Title", "*") %>
   </p>

Html.TextBox("Title") 的值从何而来?我知道,模型。在这种情况下,模型确实有一个 Title 字段。但是在某些情况下,我必须创建一个视图模型,所以我最终得到了类似的东西:

public class DinnerViewModel {
    public Dinner Dinner {get; set;};
    public SomethingElse SomethingElse {get; set;};
}

并将其用作模型, 获得正确的值。或者至少在验证失败并重新显示表单时会这样做。

我问是因为我有一个通过 AJAX 提交的表单(使用 Ajax.BeginForm())并且表单被刷新的案例。我正在为它创建一个空的新模型对象,但它仍在加载上次提交的值。当我在没有 AJAX 的情况下提交时,一切正常。

更新

我正在查看模板中的调试器。 Model.Dinner.Title 等于 "" 但 Html.TextArea("Title", Model.Dinner.Title) 将之前提交的值放入文本区域。

【问题讨论】:

    标签: asp.net-mvc ajax forms


    【解决方案1】:

    数据存储在 ModelState 中。 HtmlHelper 方法将根据表单元素的名称查找存储在模型状态中的值。 ModelState 会在我重定向时被清除,但在我刚返回时不会被清除,就像在 AJAX 调用的情况下一样。

    【讨论】:

      【解决方案2】:

      您也可以强制值为空:

      <% =Html.TextBox("Title", null, new { @value = '' }); %>
      

      将空模型(默认值)传递给视图会更好吗? 编辑这就是你正在做的我明白了;)。就按照我的第一个建议,检查请求是否是 AJAX 请求,然后在此基础上将 emtpy @value 传递给 TextBox。

      【讨论】:

      • 我将一个空模型传递给视图。
      【解决方案3】:

      我不确定我是否理解问题所在。你做了一个 ajax 请求,但你表单中的文本字段在调用后仍然保持它们的值?

      如果是这种情况,那么您应该检查这些文本字段是否在与 AjaxOption 类的 UpdateTargetId 属性关联的元素内。当您执行 ajax 请求时,只有页面的一部分被更新(由 UpdateTargetId 属性引用的那个)。无论您是否更新模型,页面中的其余字段都不会更新。看这个例子:

      <%= Html.TextBox("Title") %>
      ....
      <div id="myDiv">
          <%= Html.TextBox("SomeField") %>
      </div>
      
      <% using (Ajax.BeginForm(new AjaxOptions() { UpdateTargetId = "myDiv" })) {%>
          //... blah blah blah
      <% } %>
      

      提交ajax表单时,只有SomeField字段会更新,Title字段保持不变。

      当您提交常规表单时,整个页面都会更新,这就是为什么所有字段都会在没有 ajax 的情况下更新。

      编辑:错字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 2013-06-11
        • 2021-10-06
        相关资源
        最近更新 更多