【问题标题】:View Components and Ajax Server Side Validations查看组件和 Ajax 服务器端验证
【发布时间】:2017-04-17 20:33:30
【问题描述】:

我的应用需要能够在多个视图上发送电子邮件。我正在尝试使用视图组件,以便可以在多个地方重用我的逻辑。当用户单击“发送”按钮时,我不想刷新整个视图...我想验证表单并显示任何模型错误,否则发送电子邮件。

下面的设置适用于客户端验证,但我不确定如何恢复服务器端的模型错误并将它们显示在视图中。任何帮助表示赞赏。

Default.cshtml(查看组件 - 使用 jquery-ajax-unobtrusive)

@model EmailViewModel   
<div id="Email">
    <div class="row section-buffer">
        <div class="col-sm-12">
            <span class="section-header">Email</span>
        </div>
    </div>
    <hr />
    <form id="EmailForm"
          method="post"
          class="form-horizontal"
          asp-controller="Email"
          asp-action="Send"
          data-ajax="true"
          data-ajax-method="POST"
          data-ajax-success="sendEmailSuccess"
          data-ajax-failure="sendEmailFailure(xhr, status, error)"
          data-ajax-update="Email">

        <div class="form-group form-group-sm">
            <label class="description-label col-sm-3" asp-for="From"></label>
            <div class="col-sm-9">
                <input class="form-control" asp-for="From" />
                <span asp-validation-for="From" class="text-danger"></span>
            </div>
        </div>
        <!-- remaining fields omitted -->
        <div class="form-group form-group-sm">
            <div class="col-sm-9 col-sm-offset-3">
                <button type="submit" class="btn btn-primary">Send</button>
            </div>
        </div>
    </form>
</div>

EmailViewModel

public class EmailViewModel
{
    [Required]
    public string From{ get; set; }
    //remaining properties omitted
}

电子邮件控制器

[HttpPost]
[Route("/email/send")]
public ActionResult Send(EmailViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        //how do return my model errors back to my View Component?
    }
    else
    {
        //do send logic here
        return Content("Success");
    }
}

【问题讨论】:

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


    【解决方案1】:

    在 ViewBag 中保留错误

    @model EmailViewModel   
    <div id="Email">
        <div class="row section-buffer">
            <div class="col-sm-12">
                <span class="section-header">Email</span>
            </div>
        </div>
     <div>@ViewBag.Error</div>
        <hr />
        <form id="EmailForm"
              method="post"
              class="form-horizontal"
              asp-controller="Email"
              asp-action="Send"
              data-ajax="true"
              data-ajax-method="POST"
              data-ajax-success="sendEmailSuccess"
              data-ajax-failure="sendEmailFailure(xhr, status, error)"
              data-ajax-update="Email">
    
            <div class="form-group form-group-sm">
                <label class="description-label col-sm-3" asp-for="From"></label>
                <div class="col-sm-9">
                    <input class="form-control" asp-for="From" />
                    <span asp-validation-for="From" class="text-danger"></span>
                </div>
            </div>
            <!-- remaining fields omitted -->
            <div class="form-group form-group-sm">
                <div class="col-sm-9 col-sm-offset-3">
                    <button type="submit" class="btn btn-primary">Send</button>
                </div>
            </div>
        </form>
    </div>
    

    返回错误的视图

    [HttpPost]
    [Route("/email/send")]
    public ActionResult Send(EmailViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            //how do return my model errors back to my View Component?
             return Content(string.Join("; ", ModelState.Values
                                        .SelectMany(x => x.Errors)
                                        .Select(x => x.ErrorMessage)));
           //in send email success javascript method handle this message and show.
    
        }
        else
        {
            //do send logic here
            return Content("Success");
        }
    }
    

    【讨论】:

    • 我不想返回我生成的消息。我想返回模型验证。不过感谢您的回复。
    • 我刚刚保留了一个示例消息,你可以返回任何你需要的东西
    • return View() 不起作用,因为 Send.cshtml 不存在。我的视图组件视图名为 Default.cshtml(约定),存在于 Shared/Components/Email 中。
    • @RyanBuening 然后只返回内容并在 javascript 成功方法 sendEmailSuccess 中处理它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2012-02-08
    • 2023-03-12
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多