2011-12-27 14 views
0

我有一個簡單的ASP.NET MVC 3虛擬應用程序(剛剛學習來自WebForms的MVC)。無DB持久性的簡單表單更新

而我很困惑如何更新表單,而實際上沒有一些數據庫之間的東西。我只是一個帶有文本框的表單,在按下按鈕之後,我想看到大寫的字符串。但我什麼也沒有發生。

控制器:

public ActionResult Index() 
    { 
     ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" }; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ToUppercaseModel model) 
    { 
     model.TheString = model.TheString.ToUpper(); 

     return View(model); 
    } 

模型:

public class ToUppercaseModel 
{ 
    [Display(Name = "My String")] 
    public string TheString { get; set; } 
} 

和視圖:

@using (Html.BeginForm()) { 
    <div> 
     <div class="editor-label"> 
      @Html.LabelFor(m => m.TheString) 
     </div> 
     <div class="editor-field"> 
      @Html.TextBoxFor(m => m.TheString) 
     </div> 
     <p> 
      <input type="submit" value="Convert" /> 
     </p> 
    </div> 
} 

這是一個SIM我認爲它是正確的。現在顯然第二個索引方法中的return View(model);不起作用。我看到一些關於RedirectToAction()的內容並將數據存儲在TempData中。大多數例子只是提交一些ID,但因爲我沒有數據庫不起作用。

如果我這樣做:

return RedirectToAction("Index", model); 

我得到這個對象定義的

無參數的構造函數。

錯誤消息。這應該很簡單,不是嗎?我想我理解Post/Redirect/Get這個概念,但是沒有看到如何將它應用於這樣簡單的事情。

感謝您的澄清。

回答

1

當MVC呈現一個觀點,如果它存在,它會使用一個字段的值未遂,而不是模型值(例如,在將DateField我把「星期二」,這將不綁定模式,但你會想要向用戶顯示輸入字段並將其突出顯示爲無效),則您將更改模型的值,但不會更改已嘗試的值。

嘗試的價值在的ModelState字典中認爲:除非你想要魔串在你的代碼的負載

ModelState["KeyToMyValue"].Value.Value.AttemptedValue

訪問和改變這些值可能會非常棘手,並且確認發生在modelbinding您更改的值不會被驗證。

我在這些情況下的建議是致電ModelState.Clear(),這將刪除所有驗證和嘗試值,然後直接更改模型。最後,您想通過使用TryValidateModel(yourModel)來獲得對模型的驗證。

請注意,此方法可能是這樣做的最簡單的非hacky方法,但會刪除無法從返回的視圖綁定的企圖值。

+0

謝謝。這工作。但基本上正確的方法是使用RedirectToAction?或不? – Remy 2011-12-28 13:51:19

+0

@Remy不,返回張貼無效表單的正確方法是返回表單。 PRG模式用於在成功的表單發佈後返回視圖(以阻止人員刷新並重新提交成功的表單)。在TryValidateModel之後,您通常會在Block中測試ModelState.IsValid中的RedirectToAction – Chao 2011-12-29 10:33:27

1

你必須從2方法調用1點的方法,但你必須改變它

公衆的ActionResult指數(ToUppercaseModel模型)

,併發送至1種方法模型。

public ActionResult Index(ToUppercaseModel? model) 
    { 
     if (model == null)  
     ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" }; 
     return View(model); 
    } 
+0

但是,這將使我的第一個方法看起來完全像我的第二種方法。兩者都有「公共ActionResult索引(ToUppercaseModel模型)」 – Remy 2011-12-28 08:06:29

+0

是的。但它的工作。實際上它們是不同的。其中之一是POST方法。代碼也不同。我想你不能使用POST方法更新你的頁面。它將您的模型返回到您僅插入的數據。 – 2011-12-28 11:55:18

+0

實際上,具有完全相同簽名的2個方法不能編譯。也許我沒有看到什麼?你可以更新你的例子嗎? – Remy 2011-12-28 13:07:34

0

我想我有一個解決方案,它的工作原理,但不知道這是否應該是這樣?
基本上我只是把我的模型放入TempData並再次調用普通的Index方法。

public ActionResult Index() 
    { 
     ToUppercaseModel model = null; 

     if (TempData["FeaturedProduct"] == null) 
     { 
      model = new ToUppercaseModel { TheString = "testing" }; 
     } 
     else 
     { 
      model = (ToUppercaseModel)TempData["FeaturedProduct"]; 
     } 
     return View(model); 
    } 


    [HttpPost] 
    public ActionResult Index(ToUppercaseModel model) 
    { 
     model.TheString = model.TheString.ToUpper(); 

     TempData["FeaturedProduct"] = model; 

     //return View(model); 
     return RedirectToAction("Index"); 
    } 
+0

呃......可能是這樣......但我更喜歡我的解決方案! ;)與我的解決方案,你得到更少的代碼! :) – 2011-12-28 17:12:10

+0

其實,我跟Chao的解決方案一起去了。你的也很好,我在你的澄清之前發佈了我的信息,並且我給了你一個投票。 – Remy 2011-12-29 08:06:38

+0

明白了!泰! ;-) – 2011-12-29 15:03:05