Umbraco路由定义-ajax形式
Umbraco route definition-ajax form
您好 :) 我遇到了错误 "Cannot find the Umbraco route definition in the route values, the request must be made in the context of an Umbraco request" 和 return 这个错误的代码 - "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">
}
首先,我们要明白这次投稿我们想要达到什么目的。 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)。
我们还可以 return 任何 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");
}
希望对您有所帮助!
您好 :) 我遇到了错误 "Cannot find the Umbraco route definition in the route values, the request must be made in the context of an Umbraco request" 和 return 这个错误的代码 - "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">
}
首先,我们要明白这次投稿我们想要达到什么目的。 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)。
我们还可以 return 任何 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");
}
希望对您有所帮助!