【问题标题】:Validation between controllers控制器之间的验证
【发布时间】: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


【解决方案1】:
[HttpPost]
public ActionResult CreateCharacter(InitialChoicesViewModel model)
{
    if (ModelState.IsValid)
        return RedirectToAction("SomeSuccessfulaction");

    return View("~/Views/Home/Index.cshtml", model);
}

~/ 表示您网站的相对根目录。

上面的代码符合Post-Redirect-Get模式,为了防止某些类型的重复表单提交问题。它通过在表单提交成功时重定向到单独的操作来实现这一点,并通过返回当前视图,完成带有ModelState 信息的错误。

【讨论】:

    【解决方案2】:

    默认情况下,ASP.NET MVC 首先检查\Views\[Controller_Dir]\,但之后,如果没有找到视图,它会检查\Views\Shared。 如果您确实返回View("~/Views/Wherever/SomeDir/MyView.aspx"),您可以返回任何您想要的视图。

    但现在就你的情况,试试下面的

    public ActionResult CreateCharacter(SomeModel model)
    {
    if(!ModelState.IsValid){
     return View("~/Views/Home/Index.cshtml", model )
    }
    return View();
    }
    

    【讨论】:

      【解决方案3】:

      要检查您的 ModelState,只需在 Controller 中使用 if 语句:

      if(ModelState.IsValid) 
      {
         ...
      }
      

      如果有任何错误添加,您可以将错误消息添加到 ModelState 字典,如下所示:

      ModelState.AddModelError("Somethings failed", ErrorCodeToString(e.StatusCode));
      

      然后返回您的相同视图并将其传递给您的模型

      return View(model);
      

      如果您在视图中添加“@Html.ValidationSummary()”,它将从ModelState Dictionary 中获取错误并显示它们。但是如果您自己显示值可能具有不同的样式,您可以手动执行,看看@ 987654322@

      如果没有错误,您可以像这样返回您的 CreateCharacter 视图,只需将用户重定向到适当的操作:

      return RedirectToAction("CreateCharacter","DistributePoints");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2023-04-02
        相关资源
        最近更新 更多