2012-01-12 58 views
1

讓我們創建空的asp.net mvc 3應用程序。 代碼是奇怪的行爲Html.BeginForm

namespace MvcApplication1.Controllers 
{ 
public class MyModel 
{ 
    public int Id { get; set; } 
} 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return Index1(new MyModel() {Id = 100}); 
    } 
    public ActionResult Index1(MyModel model) 
    { 
     var nm = new MyModel(); 
     nm.Id = model.Id + 1; 
     return View("test", nm); 
    } 
} 

允許創建名爲測試共享視圖。查看代碼是

@using MvcApplication1.Controllers 
@model MyModel 

@if (Model != null) 
{ 
    using (Html.BeginForm("Index1", "Home", FormMethod.Post, new { autocomplete = "off" })) 
    { 
    <div id="compareQuestions"> 
     <p>@Model.Id</p> 
     @Html.HiddenFor(m => m.Id) 
     @Html.TextBoxFor(m => m.Id) 
     <input type="submit" value="save"/> 
    </div> 
    } 
} 

當我們發佈的形式第一次全部是好的,但在之後不正確的文本框的第一篇文章時的值重新加載。如果我們改變這個值並在控制器上保存後,我們得到的模型的值不正確,但不是我們輸入的值。這怎麼可能?

+1

在第二個帖子,是隱藏字段的值101?如果不是,什麼是不正確的值,什麼應該是正確的值? – danludwig 2012-01-12 20:41:47

+0

呃,錯誤的值是101 – Ph0en1x 2012-01-12 20:44:25

+0

'

@ Model.Id

'呈現的是什麼? 「@ Html.HiddenFor(m => m.Id)'呈現的是什麼?那麼'@ Html.TextBoxFor(m => m.Id)'? – danludwig 2012-01-12 20:54:43

回答

2

<p>@Model.Id</p>@Html.HiddenFor(m => m.Id)之間有顯着性差異。

當您張貼表單時,所有POST'的值都存儲在ModelState中。
當您使用HtmlHelper方法時,它們首先從ModelState中提取值。如果ModelState不包含值,則它會查看實際的m.Id

因此,當您第一次獲得表格時,沒有ModelState。但是,一旦POST POST表單,它將值存儲到ModelState,所以隱藏的輸入使用該值而不是m.Id

如果你希望總是用m.Id,那麼你需要清除控制器的ModelState

public ActionResult Index1(MyModel model) 
{ 
    ModelState.Clear(); 
    ... 
+0

但實際上爲什麼它的實現方式如此呢? – Ph0en1x 2012-01-12 21:14:43

+0

這是驗證的機制。如果您提交的表單輸入無效,ModelState會保存該輸入,以便在重新顯示錶單時,這些字段不爲空。例如,如果我的模型需要'int',並且鍵入'abc',那麼表單將以'abc'和一條錯誤消息重新顯示。 – 2012-01-12 22:06:45

1

看起來這是正確的行爲,因爲您已經編寫了您的操作方法。在視圖中,您爲相同的確切模型屬性呈現文本框和隱藏字段。

因此,當您在帖子期間將ID增加1時,您正在將文本框中的值增加到隱藏字段中。

如果您希望文本框和隱藏字段在第二篇文章後有不同的值,那麼您的模型需要不同的屬性。

另一個問題可能是,由於您有兩個不同的<input元素具有相同的名稱,因此您無法確定表單是否會從隱藏字段或文本框中發送值。再次,如果這兩個字段應該有不同的值,它們需要在模型上具有不同的屬性。如果您希望它們始終保持相同的值,請在視圖中放置一個TextBox或Hidden,但不能同時使用兩者。

+0

不,你不明白題。當然它提供相同的價值,但價值是錯誤的。

@ Model.Id

@ Html.HiddenFor(m => m.Id)具有不同的值,但它們應該具有相同的值 – Ph0en1x 2012-01-12 20:50:56