不知道爲什麼你會使用在後FormCollection
,但也許你來自一個WebForms的背景。在MVC中,您應該使用ViewModels將數據傳輸到Views或從Views傳輸數據。
默認情況下,MVC 3應用程序中的Register
方法在Register
視圖中使用ViewModel。你應該簡單地發回。實際上,如果您不知道它是Internet模板的一部分,則默認應用程序已經爲您創建了。
標準模式是讓ViewModel代表您在View中使用的數據。例如,你的情況:
public class RegisterViewModel {
[Required]
public string Name { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email address")]
public string Email { get; set; }
}
你的控制器應包含2個動作,一個Get
和Post
。 Get
呈現視圖併爲用戶輸入數據做好準備。在提交後查看Post
行動然後被調用。視圖將ViewModel發送到動作,然後該方法採取行動來驗證和保存數據。
如果數據存在驗證錯誤,將ViewModel返回到視圖並顯示錯誤消息非常簡單。
這裏是Get
行動:
public ActionResult Register() {
var model = new RegisterViewModel();
return View(model);
}
這裏是Post
行動:
[HttpPost]
public ActionResult Register(RegisterViewModel model) {
if(ModelState.IsValid) { // this validates the data, if something was required, etc...
// save the data here
}
return View(model); // else, if the model had validation errors, this will re-render the same view with the original data
}
你的看法會是這個樣子
@model RegisterViewModel
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.Name) <br />
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.Email) <br />
@Html.ValidationMessageFor(model => model.Email)
</div>
}
使用其他策略來捕捉並將數據保存在MVC應用程序中是絕對有可能的一個非常可擴展的框架。但是有一個特定的模式可以使MVC發揮作用,並且與這種模式相互作用有時會證明很困難。對於初學者來說,最好首先了解首選的模式和策略,然後一旦理解得很好,就可以採用一些自己定製的策略來滿足您的需求。那時你應該理解系統,以便知道你需要改變什麼以及在哪裏。
快樂編碼!
只是好奇你爲什麼要使用FormCollection而不是ViewModel。它會讓你的生活更容易,尤其是這個問題:-) –
向我們展示渲染視圖的動作,這樣我們就可以根據你的代碼給出正確的答案。這一切都取決於那種方法 –
我也有同感。註冊的GET方法如何?你在那裏使用什麼模型?爲什麼你不能在POST中使用同一個模型? –