2009-05-30 62 views
0

當你有一個由Html.BeginForm()創建的ASP.Net MVC表單時,它裏面的字段如何填充?在如何在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(「標題」)的值從哪裏來?我知道,模型。在這種情況下,模型確實有一個標題字段。但我在那裏我必須創建一個視圖模型,所以我最終不得不像案例:

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

和使用,作爲一個模式,<%= Html.TextBox(「標題」)%>獲取正確的價值。或者至少如果驗證失敗並且表單重新顯示,就會出現這種情況。

我在問,因爲我有一個通過AJAX提交的表單(使用Ajax.BeginForm()),表單被刷新。我爲它創建了一個新的模型對象,爲空,但它仍然加載最後提交的值。當我沒有AJAX提交一切正常。

更新

我看在模板中的調試器。 Model.Dinner.Title等於「」,但Html.TextArea(「Title」,Model.Dinner.Title)放置在文本區域內提交的以前的值。

回答

2

數據存儲在ModelState中。 HtmlHelper方法將根據表單元素的名稱查找存儲在模型狀態中的值。當我重定向時,模型狀態得到清理,但不是當我剛剛返回時,就像AJAX調用一樣。

0

您也可以強制值是空的:

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

這將是更好,雖然傳遞一個空模型(默認值),以查看? 編輯這就是你在做什麼,我看到;)。只是爲了我的第一個建議,檢查請求是否是AJAX請求,然後根據它將emtpy @value傳遞給TextBox。

+0

我將一個空模型傳遞給視圖。 – Pablo 2009-05-30 21:47:12

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領域將得到更新,標題字段將保持不變。

當您提交常規表單時,整個頁面會被更新,這就是爲什麼所有字段都會在沒有ajax的情況下更新。

編輯:錯字。