C# 如果模型状态无效,则隐藏视图中的图元

C# 如果模型状态无效,则隐藏视图中的图元,c#,asp.net-mvc,validation,design-patterns,C#,Asp.net Mvc,Validation,Design Patterns,想象一个简单的表单,它接受如下电子邮件输入: @using (Html.BeginForm("save", "email", FormMethod.Post, new { @id = "my__form" })) { <div class="field"> @Html.LabelFor(model => model.Email) @Html.ValidationMessageFor(model => model.Email)

想象一个简单的表单,它接受如下电子邮件输入:

@using (Html.BeginForm("save", "email", FormMethod.Post, new {  @id = "my__form" }))
{
    <div class="field">
        @Html.LabelFor(model => model.Email)
        @Html.ValidationMessageFor(model => model.Email)
        @Html.TextBoxFor(model => model.Email, new { @placeholder = "Enter your email", @type = "email" })
    </div>

    <button type="submit" class="btn">Save email</button>
    <div class='spinner'></div>
}
在表单提交中,我在页面上显示一个微调器:

$('.btn').on("click", function (event) {
   event.preventDefault();
   $('#my__form').submit();
   $('.spinner').show();
});
我的行动如下:

[HttpPost]
[Route("email")]
public ActionResult Save(EmailViewModel model)
{
    if (ModelState.IsValid)
    {
        //Do stuff with email 
        return RedirectToAction("action", "contoller");
    }
    return View(model);
 }
将上述代码视为表示更一般问题的伪代码

如果模型状态无效并且UI以某种方式更新(在本例中显示微调器),那么重置表单的模式或机制是什么

为清楚起见,我这里不是在谈论标准数据验证等。我尝试在表单上使用隐藏输入,我可以使用
ModelState.addmodeleror(“spinner”,false)
填充该表单,然后充当javascript可以读取的“开关”,然后隐藏微调器。这感觉像一个黑客


感觉这是一个共同的问题,有共同的解决方案吗

您提到的黑客实际上是如何使用普通的ASP.NET MVC实现的

可以有不同的实现,例如将标志存储在
ViewBag
中。但想法是一样的


您最好通过AJAX发布表单,其结果可能包括一个成功标志和/或验证错误列表。然后,您可以根据此结果通过JavaScript在提交处理程序中操作DOM。

不清楚您在做什么。您取消了脚本中的提交,但仍然调用了
.submit()
,因此您已经离开了页面(您的
$('.spinner').show();
没有任何意义)。你为什么要重新设置表单?我的例子有些做作。假设我只能检查输入服务器端的有效性。还假设我想在提交时显示微调器。如果发现输入无效,如何返回视图以显示验证错误并从显示中删除微调器?您可以随时进行ajax调用以检查有效性,或者使用
[Remote]
属性(如果有效性依赖于模型中的其他属性(与数据库等外部资源相反),则可以编写一个自定义的
ValidationAttribute
,该属性实现
IClientValidatable
,以便获得客户端和服务器端验证)如果使用ajax调用,请在开头显示微调器。在方法中,如果无效,则返回“错误消息”,并在成功回调中显示它(并隐藏微调器)。感谢Stephen。感谢您的帮助。
[HttpPost]
[Route("email")]
public ActionResult Save(EmailViewModel model)
{
    if (ModelState.IsValid)
    {
        //Do stuff with email 
        return RedirectToAction("action", "contoller");
    }
    return View(model);
 }