2009-09-01 93 views
1

在我的控制器在Asp.net MVC 1應用程序中,我想使用UpdateModel在我的控制器中使用POST數據填充變量。我已經看了幾十個例子,但即使是最基本的例子也似乎對我無言以對。Asp.net MVC UpdateModel(myClass)的基本問題

這是一個非常基本的例子,它只是不起作用。 我在做什麼錯?

public class TestInfo 
    { 
     public string username; 
     public string email; 
    } 

    public class AdminController : Controller 
    { 

     public ActionResult TestSubmit() 
     { 
      var test = new TestInfo(); 
      UpdateModel(test);//all the properties are still null after this executes 
      //TryUpdateModel(test); //this returns true but fields/properties all null 
      return Json(test); 
     } 


    } 


//Form Code that generates the POST data 
    <form action="/Admin/TestSubmit" method="post"> 
     <div> 
      <fieldset> 
       <legend>Account Information</legend> 
       <p> 
        <label for="username">Username:</label> 
        <input id="username" name="username" type="text" value="" /> 
       </p> 
       <p> 
        <label for="email">Email:</label> 
        <input id="email" name="email" type="text" value="" /> 
       </p> 
       <p> 
        <input type="submit" value="Login" /> 
       </p> 

      </fieldset> 
     </div> 
    </form> 
+0

感謝您的快速回復傢伙。我喜歡從午餐回來,看到4個答案。我正在測試他們。 快速邊注。我以Steve Sanderson的Pro Asp.net MVC Framework的第374頁上的示例爲基礎,它不使用[AcceptVerbs(HttpVerbs.Post)]頭或類型化參數。這本書不正確嗎? – Glenn 2009-09-01 16:14:33

+0

想通了。這本書是正確的。它忽略了在這種情況下,UpdateModel所使用的反射方法僅適用於屬性,即使通過可能適用於它當前沒有的字段。看起來像一個MVC錯誤給我。屬性通常是更好的練習,但對於簡單的視圖模型,它更容易設置頂部的默認值,而不是重新輸入所有屬性值,並在類構造函數中設置默認值。 – Glenn 2009-09-01 16:32:31

回答

2

讓你的公共領域的性質:

public class TestInfo 
    { 
     public string username {get;set;} 
     public string email{get;set;} 
    } 
+0

UpdateModel依賴於屬性,而不是域,iirc。 – 2009-09-01 15:43:52

+0

啊,錯過了。無論如何,我認爲更好的練習 – Glenn 2009-09-01 16:24:50

+0

奇怪的是,它不適用於領域。猜猜這是我的懲罰,因爲沒有在構造函數中設置屬性默認值所需的額外編碼:-) – Glenn 2009-09-01 16:34:03

3

它看起來就像你正在試圖獲得控制器更新基於表單元素的模型。試試這個:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult TestSubmit(TestInfo test) 
    { 
     UpdateModel(test); 
     return Json(test); 
    } 

在代碼中,你要創建一個新的TestModel而不是讓MVC運行時從HttpPost序列化。我也讓自己繞着這個軸轉動,也不是唯一的!

+0

這是一個很好的做法,但是使用字段而不是屬性是導致我的作業默默失敗的原因。 – Glenn 2009-09-01 16:36:56

0

我不是太熟悉ASP.NET MVC,但不應該將TestSubmit方法看上去就像這樣:

public ActionResult TestSubmit(TestInfo test) 
{ 
    UpdateModel(test); 
    return Json(test); 
} 
-1

在控制器應該有兩個方法,一個用於響應GET,另一個用於響應POST。

因此,首先有一個GET方法:

public ActionResult Test() 
{ 
    return View (/* add a TestInfo instance here if you're getting it from somewhere - db etc */); 
} 

其次,你需要一個POST方法:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Test (TestInfo test) 
{ 
    return Json (test); 
} 

請注意,有沒有UpdateMethod那裏,ModelBinder會做,對於您。

+0

這些都是很好的最佳實踐,但我的問題是使用字段。我測試了你的建議,並且它是一種乾淨的方式來拆分獲取和發佈請求 – Glenn 2009-09-01 16:35:52