【发布时间】:2013-12-31 17:57:14
【问题描述】:
我有一个带有 Index.cshtml Razor 视图的 HomeController,该视图使用带有验证属性的 InitialChoicesViewModel。索引视图包含以下形式:
@using (Html.BeginForm("CreateCharacter", "DistributePoints", FormMethod.Get))
这转到另一个控制器(这是我想要的):
public class DistributePointsController : Controller
{
public ActionResult CreateCharacter(/* my form parameters */)
// ...
}
如何在表单上执行服务器端验证(例如检查ModelState.IsValid),并在错误时返回带有正确ValidationSummary 的原始索引视图? (成功后我想返回另一个控制器的 CreateCharacter 视图。)
根据 John H 的回答,我解决了如下问题:
@using (Html.BeginForm("CreateCharacter", "Home"))
家庭控制器:
[HttpPost]
// Only some of the model fields are posted, along with an additional name field.
public ActionResult CreateCharacter(InitialChoicesViewModel model, string name)
{
if (ModelState.IsValid)
{
return RedirectToAction("CreateCharacter", "DistributePoints",
new {name, model.Level, model.UseAdvancedPointSystem});
}
// Unsure how to post a collection - easier to reload from repository.
model.ListOfStuff = _repository.GetAll().ToList();
return View("Index", model);
}
我也必须在我的视图模型中添加一个无参数构造函数。
【问题讨论】:
-
这看起来不错。有时您必须重建模型的某些部分才能重新显示视图。一个完美的例子是重新填充下拉列表,因为只有下拉列表的选定值会从表单发送回服务器。另外,如果您已经拥有所需的服务器端可用数据,最好查询它,而不是信任用户的输入。
标签: asp.net-mvc forms validation asp.net-mvc-4