当用户填写订阅表单或联系表单并且表单无效时,它会重定向到表单视图
表单是索引页面中的部分表单,可能是问题,但我不知道如何解决 - 它是一个单页面应用程序,包含两个操作,订阅和联系。
如何让它保持在同一页面并显示错误。
这是订阅表格(联系方式类似)
@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?;**
}
答案 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)
}
答案 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 Rashid撰写的博客文章(参见第13节“使用PRG模式进行数据修改”)here这应该可以帮助您入门,但还有其他有用的帖子
博客文章描述了如何使用TempData和ActionFilters导入和导出ModelStates(通过使用属性修饰您的操作),并且对于重定向非常有用,以避免重新创建ViewModel和传输ModelStates。
从我看到的,没有“单线快速修复”,你只需要研究和测试这种模式,或沿着ajax / json路线走。