不知道你为什么会FormCollection
在帖子中使用,但也许你来自 WebForms 背景。在 MVC 中,您应该使用 ViewModels 将数据传输到视图和从视图传输。
默认情况下,Register
MVC 3 应用程序中的方法在视图中使用 ViewModel Register
。你应该简单地把它发回去。事实上,如果您不知道作为 Internet 模板的一部分,默认应用程序已经为您创建了。
标准模式是有一个 ViewModel 代表您将在视图中使用的数据。例如,在您的情况下:
public class RegisterViewModel {
[Required]
public string Name { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email address")]
public string Email { get; set; }
}
您的控制器应该包含 2 个动作, aGet
和 a Post
。呈现视图并Get
准备好供用户输入数据。提交视图后,Post
将调用该操作。View 将 ViewModel 发送到操作,然后该方法采取操作来验证和保存数据。
如果数据存在验证错误,将 ViewModel 返回给 View 并显示错误消息非常简单。
这是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 成为它的样子,并且与该模式相反的工作有时会被证明是困难的。对于初学者来说,最好先了解首选的模式和策略,然后一旦理解得很好,您就可以采用一些自己的自定义策略来满足您的需求。到那时,您应该对系统有足够的了解,知道您需要更改什么以及在哪里更改。
编码快乐!!