2009-06-04 57 views
5

我有一個簡單的測試應用程序:Html.TextBox是否使用Request.Params而不是Model?

型號:

public class Counter 
{ 
    public int Count { get; set; } 

    public Counter() 
    { 
     Count = 4; 
    } 
} 

控制器:

public class TestController : Controller 
{ 
    public ActionResult Increment(Counter counter) 
    { 
     counter.Count++; 
     return View(counter); 
    } 
} 

查看:

<form action="/test/increment" method="post"> 
    <input type="text" name="Count" value="<%= Model.Count %>" /> 
    <input type="submit" value="Submit" /> 
</form> 

點擊提交,我得到這樣的價值觀:

5,6,7,8,...

隨着Html.TextBox我預料的一樣的行爲

<form action="/test/increment" method="post"> 
    <%= Html.TextBox("Count") %> 
    <input type="submit" value="Submit" /> 
</form> 

,但實際上得到

5,5, 5,5.

看來Html.TextBox使用Request.Params代替模型?

回答

8

Html.TextBox()在內部使用ViewData.Eval()方法,它首先嚐試從字典ViewData.ModelState中檢索值,然後從ViewData.Model的屬性中檢索值。這樣做是爲了允許在無效表單提交後恢復輸入的值。

從ViewData中刪除計數值。的ModelState字典幫助:

public ActionResult Increment(Counter counter) 
{ 
    counter.Count++; 
    ViewData.ModelState.Remove("Count"); 
    return View(counter); 
} 

另一種解決方案是使爲得到兩個不同的控制器方法和POST操作:

public ActionResult Increment(int? count) 
{ 
    Counter counter = new Counter(); 

    if (count != null) 
     counter.Count = count.Value; 

    return View("Increment", counter); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Increment(Counter counter) 
{ 
    counter.Count++; 

    return RedirectToAction("Increment", counter); 
} 

計數器對象也可以通過TempData的字典過去了。

您可能也有興趣Stephen Walther的文章Repopulate Form Fields with ViewData.Eval()

+0

謝謝亞歷山大! – alex2k8 2009-06-05 08:02:46

+0

那麼爲什麼指定Model.Count顯式不起作用?<%= Html.TextBox(「Count」,Model.Count)%> – 2009-06-05 09:00:15

+1

因爲起初Html.TextBox()從ModelState字典中獲取值。 – 2009-06-05 09:22:22

0

Html.TextBox有更多的參數比one..first參數的名稱或輸入元素的ID,而第二個是值...

這麼寫你的文本助手這樣的:

<%= Html.TextBox("Count",Model.Count) %> 

歡呼聲

+3

這也不行:-( – alex2k8 2009-06-05 07:16:14

1

這不是問題。指定

<%= Html.TextBox("Count") %> 

相當於指定

<%= Html.TextBox("Count", null) %> 

這將拉動匹配值從ModelStateDictionary(命名爲 「計數」)。

但即便如此,明確地傳遞

<%= Html.TextBox("Count", Model.Count) %> 

結果由alex2k8描述的相同的行爲。

相關問題