如何在ASP.Net MVC中预先填充表格?

时间:2009-05-30 21:09:34

标签: asp.net-mvc ajax forms

当你有一个由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;};
}

并将其用作模型,&lt;%= Html.TextBox(“Title”)%&gt;获得正确的价值。或者,如果验证失败并重新显示表单,至少会这样做。

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

更新

我正在模板中看调试器。 Model.Dinner.Title等于“”但Html.TextArea(“Title”,Model.Dinner.Title)放置在文本区域内提交的先前值。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您也可以强制值为空:

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

将空模型(默认值)传递给View会更好吗? 编辑这就是我所看到的;)。只需要我的第一个建议,检查请求是否是AJAX请求,然后根据它将emtpy @value传递给TextBox。

答案 2 :(得分:0)

我不确定我是否理解这个问题。你做一个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的情况下更新的原因。

编辑:错字。