问题概述:
我创建了一个 Surface 控制器,其中包含使用 @Html.Action(...) 调用的操作。
@Html.Action 调用在宏局部视图中完成,宏包含在使用富文本编辑器的页面内容中。
(我是新手,所以如果我以错误的方式处理事情,请告诉我。)
Surface 控制器有一个 GET 和一个 POST 操作,但它是在宏部分中调用的 get 操作。
获取操作呈现正常,在表单中不输入任何数据将使模型状态无效(这是我目前正在测试的)。
提交表单(没有输入数据)意味着我可以进入我的 POST 操作,ModelState.IsValid 设置为 false 并返回 CurrentUmbracoPage()。
一切都好...调试时没有遇到异常...
此时页面上出现错误文本“加载部分视图脚本时出错”。
我要做的就是返回显示验证消息的同一页面。
细节:
Umbraco v6.0.5
我目前正在使用的控制器用于重置用户的密码。我还有一个登录控制器,它通过使用 RedirectToCurrentUmbracoPage() 来解决这个问题。
要访问包含宏的页面,我使用地址 http://{testhost}/Reset-Password 返回的错误文本为:加载部分视图脚本时出错(文件:~/Views/MacroPartials/ResetPassword.cshtml)
代码在一个单独的解决方案中,视图和 bin 目录被复制。使用 nuget 包 UmbracoCMS.Scaffolding。
控制器代码:
public class ResetPasswordSurfaceController : SurfaceController {
[ChildActionOnly]
[HttpGet]
public ActionResult Reset(string token, string email) {
// Validation Code Omited
var user = Membership.GetUser(username);
return PartialView("Reset", new ResetPasswordSurfaceModel { UserID = user.ProviderUserKey.AsInt() });
}
[HttpPost]
public ActionResult PostReset(ResetPasswordSurfaceModel model) {
if (ModelState.IsValid) {
//Password reset code omited
return RedirectToCurrentUmbracoPage();
}
//works but only partial view content is rendered
// return PartialView("Reset",model);
return CurrentUmbracoPage();
}
}
查看 - ~\Views\ResetPasswordSurface\Reset.cshtml:
@model UmbracoExt.Models.ResetPasswordSurfaceModel
@using (Html.BeginUmbracoForm("PostReset", "ResetPasswordSurface")) {
@Html.EditorForModel()
<input type="submit" value="Submit" />
}
宏部分视图 - ~\Views\MacroPartials\ResetPassword.cshtml:
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@Html.Action("Reset", "ResetPasswordSurface")
任何帮助表示赞赏。
编辑:
从重置操作中删除 [HttpGet] 属性表明,在调用 PostReset 操作之后,还会调用重置操作。
将 PostReset 重命名为 Reset 并将 httpget 属性重新添加到原始的 Reset Action 会导致 post 操作被调用两次。第二次调用导致异常:Can only use UmbracoPageResult in the context of an Http POST when using a SurfaceController form
我已经恢复了更改,所以我回到了在 PostReset 操作之后调用的 Reset ([HttpGet]) 处。
所以问题仍然存在。我该如何解决这个问题?我需要从 PostReset Action 返回结果。