代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

如何在ASP.NET MVC中预填充窗体?

  •  0
  • Pablo Fernandez  · 技术社区  · 15 年前

    当您有一个由html.begininform()创建的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”)的值来自何处?我知道,模特儿。在这种情况下,模型有一个标题字段。但是我有一些案例需要创建一个视图模型,所以我最终得到如下的结果:

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

    并将其用作模型,<%=html.textbox(“title”)%>获取正确的值。或者至少在验证失败并重新显示表单时是这样。

    我之所以这样问是因为我有一个通过Ajax(使用ajax.begininform())提交的表单案例,并且表单会得到刷新。我正在为它创建一个新的模型对象,空的,但它仍然在加载上一次提交的值。当我在没有Ajax的情况下提交时,一切都正常。

    更新

    我正在观看模板中的调试器。model.dinner.title等于“”,然而html.textfarea(“title”,model.dinner.title)将以前提交的值放在文本区域内。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Pablo Fernandez    15 年前

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

        2
  •  0
  •   Ropstah    15 年前

    您还可以强制值为空:

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

    将空模型(默认值)传递给视图会更好吗? 编辑 这就是你所做的,我明白了。只需执行我的第一个建议,检查请求是否是Ajax请求,然后基于此将emtpy@值传递到文本框。

        3
  •  0
  •   Gerardo Contijoch    15 年前

    我不确定我理解这个问题。您执行了一个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字段会得到更新,标题字段将保持不变。

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

    编辑: Typo。