表单无效时如何防止重定向或操作

时间:2018-03-15 14:55:29

标签: c# asp.net asp.net-mvc asp.net-core

当用户填写订阅表单或联系表单并且表单无效时,它会重定向到表单视图

表单是索引页面中的部分表单,可能是问题,但我不知道如何解决 - 它是一个单页面应用程序,包含两个操作,订阅和联系。

如何让它保持在同一页面并显示错误。

这是订阅表格(联系方式类似)

@model SubscribeViewModel

<!-- Subscribe Form -->
<form asp-controller="Home" asp-action="Subscribe" method="POST" enctype="multipart/form-data">
    <div class="form-row">
        <div>
            <input asp-for="Email" placeholder="Email address">
            <span asp-validation-for="Email" class="help-block text-danger"></span>
        </div>
        <div>
            <button type="submit">Subscribe</button>
        </div>
    </div>
</form>

这是家庭控制器

//Subscribe
[HttpPost]
public IActionResult Subscribe(SubscribeViewModel vm)
{
    if (ModelState.IsValid)
    {
        _mailService.SubscribeEmail(vm.Email);

        return RedirectToAction("Index", "Home");
    }

    return - **What to do here??;**
}

// Send Mail
[HttpPost]
public IActionResult Contact(ContactViewModel vm)
{
    if (ModelState.IsValid)
    {
        _mailService.SendEmail(vm.Name, vm.Email, vm.Subject, vm.Message);

        return RedirectToAction("Index", "Home");
    }

    return - **And here?;**
}

5 个答案:

答案 0 :(得分:1)

您需要return View();

但您也想将[ChildActionOnly]添加到控制器中。

    //Subscribe
[ChildActionOnly]
[HttpPost]
public IActionResult Subscribe(SubscribeViewModel vm)
{
    if (ModelState.IsValid)
    {
        _mailService.SubscribeEmail(vm.Email);
        return RedirectToAction("Index", "Home");
    }

    return PartialView(vm)
}

ChildActionOnly

答案 1 :(得分:0)

如果ViewModel无效,请返回最初呈现表单的View,并传递您在POST操作中收到的ViewModel。

此ViewModel将包含ModelState.Errors中可由MVC显示的错误,例如与@Html.ValidationSummary()

为了使其正常工作,请确保回发ViewModel的所有属性!如果用户无法更改属性,请为其渲染隐藏输入,以便在往返时不会丢失。

[HttpPost]
public IActionResult Subscribe(SubscribeViewModel vm) {
     if (!ModelState.IsValid) {
         return PartialView("_SubscribeForm", vm);
     }

     // model is valid
     // ...
}

答案 2 :(得分:0)

您只需要使用此代码替换return - **What to do here??;**

return View("Your View name", vm);

此行填充用户已输入的所有字段,以便您识别错误的值。

答案 3 :(得分:0)

我想......

返回View();

你只需要返回View() 按照我的意见,你在索引视图控制器中编写所有动作,这样你就写回返View()是自动返回索引视图,而且ModelState.IsValid也是假,所以它显示错误消息,所以我认为足以返回View()。

答案 4 :(得分:0)

您可以使用ajax发布数据并报告错误(这可能是最干净的解决方案,但这需要jQuery脚本并修改您的帖子操作)。作为答案发布太多了,你可能需要非常具体的东西。

在代码中使用“重定向”方法意味着重定向回主页,同时也传输ModelState错误(从post操作导出ModelState并将其导入主页操作),这可以完成,相当简单,但确实需要更多的编码(可能还有更多的研究) - 尝试搜索“PRG模式”以找到编码示例。

作为一个起点,有一篇由Kazi Manzur Ra​​shid撰写的博客文章(参见第13节“使用PRG模式进行数据修改”)here这应该可以帮助您入门,但还有其他有用的帖子

博客文章描述了如何使用TempData和ActionFilters导入和导出ModelStates(通过使用属性修饰您的操作),并且对于重定向非常有用,以避免重新创建ViewModel和传输ModelStates。

从我看到的,没有“单线快速修复”,你只需要研究和测试这种模式,或沿着ajax / json路线走。