【问题标题】:Umbraco route definition-ajax formUmbraco 路由定义-ajax 形式
【发布时间】:2016-09-12 21:06:22
【问题描述】:

嗨 :) 我遇到错误“无法在路由值中找到 Umbraco 路由定义,请求必须在 Umbraco 请求的上下文中进行”并返回此错误的代码和平 - “return RedirectToCurrentUmbracoPage(); ”。 seding ajax 表单后。

这是我的控制器:

public class ContactController : Umbraco.Web.Mvc.SurfaceController
{
    private string GMAIL_SERVER = "smtp.gmail.com";
    private int PORT = 587;

    [ChildActionOnly]
    public ActionResult ContactForm()
    {
        var model = new ContactFormModel()
        {
           Email = "",
           Name = "",
           Subject = "",
           Message = ""
        };

        return PartialView("ContactForm", model);
    }

    [NotChildAction]
    [HttpPost]
    public ActionResult ContactForm(ContactFormModel model)
    {
        var fromAddress = new MailAddress("xxx@gmail.com", model.Name);
        var toAddress = new MailAddress("xxx@gmail.com", "To Name");
        string fromPassword = "xxx";
        string subject = model.Subject;
        string body = model.Message;

        var smtp = new SmtpClient
        {
            Host = "smtp.gmail.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
            Timeout = 20000
        };

        if (!ModelState.IsValid)
        {        
            return CurrentUmbracoPage();
        }

        var message = new MailMessage(fromAddress, toAddress)
        {
            Subject = model.Subject,
            Body = "test"
        };
        smtp.Send(message);

        return RedirectToCurrentUmbracoPage();
    }
}

这个表格代码:

@using (Ajax.BeginForm("ContactForm" ,"Contact", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace }))
{
    @Html.TextBoxFor(m => m.Name, null, new { name = "name", id = "name", placeholder = "Name" })
    @Html.ValidationMessageFor(m => m.Name)
    @Html.TextBoxFor(m => m.Email, null, new { name = "email", id = "email", placeholder = "Email address" })
    @Html.ValidationMessageFor(m => m.Email)
    @Html.TextBoxFor(m => m.Subject, null, new { name = "subject", id = "subject", placeholder = "Subject" })
    @Html.ValidationMessageFor(m => m.Subject)
    @Html.TextAreaFor(m => m.Message, new { rows = "", cols = "", name = "message", id = "message", placeholder = "Your message" })
    @Html.ValidationMessageFor(m => m.Message)
    <input type="submit" id="contact-submit" value="SEND MESSAGE">
}

【问题讨论】:

    标签: c# .net ajax umbraco umbraco7


    【解决方案1】:

    首先,我们需要了解在提交过程中我们想要实现的目标。 Ajax 请求不是典型页面请求的一部分,并且在此期间未传递/填充 Umbraco 上下文。如果我们想重新加载/刷新同一个页面,我们可以使用 Javascript 操作结果并执行简单的重新加载,例如

    return JavaScript("location.reload(true)");
    

    如果我们想使用 Umbraco 上下文(Url 或其他任何内容),我们可以手动启动 UmbracoHelper 并做任何我们想做的事情:

    var umbracoHelper = new UmbracoHelper(UmbracoContext.Current);
    var node = umbracoHelper.TypedContent(nodeId);
    //...
    

    或者只是使用带有 Umbraco 实现/包装器的 WebAPI 控制器,您可以在此处阅读更多信息:https://our.umbraco.org/documentation/reference/routing/webapi/

    如果它是一个典型的 SurfaceController 操作(不是 Ajax 调用),我们可以使用 Umbraco 包装器中所有可能的重定向和方法(检查:https://our.umbraco.org/documentation/reference/templating/mvc/forms)。

    如果在积极提交表单后需要,我们还可以返回任何 PartialView、Content 甚至 JSON。在我看来,这是在这种情况下最好的解决方案。在你的情况下:

    [NotChildAction]
    [HttpPost]
    public ActionResult ContactForm(ContactFormModel model)
    {
        var fromAddress = new MailAddress("xxx@gmail.com", model.Name);
        var toAddress = new MailAddress("xxx@gmail.com", "To Name");
        string fromPassword = "xxx";
        string subject = model.Subject;
        string body = model.Message;
    
        var smtp = new SmtpClient
        {
            Host = "smtp.gmail.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
            Timeout = 20000
        };
    
        if (!ModelState.IsValid)
        {        
            return PartialView("_Error");
        }
    
        var message = new MailMessage(fromAddress, toAddress)
        {
            Subject = model.Subject,
            Body = "test"
        };
        smtp.Send(message);
    
        return PartialView("_Success");
    }
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2015-08-07
      • 1970-01-01
      相关资源
      最近更新 更多