当你有一个由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)放置在文本区域内提交的先前值。
答案 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的情况下更新的原因。
编辑:错字。