1

以下是提交数据的控制器的两个示例。如果验证失败,一个返回输入模型,另一个则没有。有人能告诉我哪种方法是正确的还是首选的?它们的行为似乎完全相同。

带返回模型

    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
    //do stuff
        }


        return View(model);
    }

不返回模型

    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
    //do stuff
        }


        return View();
    }
4

4 回答 4

2

通常您希望用户在他提交的数据无效时显示错误消息(例如,他没有在要求成为电子邮件的字段中输入有效的电子邮件地址 - 请参阅 MVC ModelValidation 了解更多信息)。

您使用 ModelState.IsValid 进行检查。在这种情况下,您通常会向他显示他来自的页面(“Register”),并且您还想显示他在表单字段中输入的数据(= RegisterModel)。但是您想显示一条错误消息,告诉他哪些字段不正确。

如果用户的数据是正确的并且您的操作成功(在这种情况下他已成功注册),您通常不会再次向他显示注册表单,但您会将他重定向到成功页面。

这是一个简单的示例,如何在成功操作后验证、显示错误和重定向

您的代码中的示例:

[HttpPost]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
       //do stuff
       // redirect to a success page
       return RedirectToAction("Success");
    }

    // data is not valid - show the user his data and error messages
    // using Html Helper methods (see link for details)
    return View(model);
}

在注册视图上(如果没有 - 如果你有一个强类型视图,你可以使用 HTML Helper 重载 - 例如使用 Html.LabelFor、TextboxFor 等方法):

显示一般错误消息/摘要;

...
<%= Html.ValidationSummary("Register was not successfull") %>

在输入旁边显示错误消息:

...
<%= Html.TextBox("Email") %>
<%= Html.ValidationMessage("Email", "*") %>
于 2012-07-14T09:52:41.500 回答
0

你会在没有模型传递给它的情况下查看渲染吗?可能不会,所以第二个会失败。

我建议您阅读有关Post Redirect Get模式

http://en.wikipedia.org/wiki/Post/Redirect/Get

于 2012-07-14T09:46:36.183 回答
0

最后的第一个动作是将模型传递给视图,第二个动作是返回一个空视图。所以我建议你去第一个

但是当验证失败时,您应该以这种方式进行错误处理

if (ModelState.IsValid)
        {
    //do stuff
        }
   else
   {
      ModelState.AddModelError("RegisterModel Errors", "some error occured");
   } 

       return View(model);
于 2012-07-14T09:54:49.043 回答
0

由于您有一个强类型视图,因此在任何一种情况下,您都需要将相应的模型传递给视图(否则您的视图可能会在尝试访问空模型上的属性时崩溃)。成功后,您可以重定向到另一个页面,或者您应该能够在同一页面中向用户发送通知,更新操作是成功还是失败(取决于您是否想要基于 HTML 的常规解决方案或启用 AJAX 的解决方案) . 至于验证,有通常的客户端验证和基于 jQuery 的不显眼的客户端验证选项。

这里有几个有用的链接

ASP.NET 模型验证(这是基于 MVC2,但对于 MVC3 应该相同)

MVC3 不显眼的客户端验证

于 2012-07-14T10:45:44.143 回答