我创建了一个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();
}
}
@model UmbracoExt.Models.ResetPasswordSurfaceModel
@using (Html.BeginUmbracoForm("PostReset", "ResetPasswordSurface")) {
@Html.EditorForModel()
<input type="submit" value="Submit" />
}
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@Html.Action("Reset", "ResetPasswordSurface")
感谢任何帮助。
从重置操作中删除[HttpGet]属性表明,在调用PostReset操作后,也会调用重置操作。
将PostReset重命名为Reset并将httpget属性重新添加到原始的Reset Action会导致调用post动作两次。 第二次调用会导致异常: 在使用SurfaceController表单时,只能在Http POST的上下文中使用UmbracoPageResult
我已经恢复了更改,所以我在PostReset操作后调用Reset([HttpGet])。
所以问题仍然存在。我该如何解决这个问题? 我需要从PostReset Action返回结果。
答案 0 :(得分:9)
这就是我解决这个问题的方法:
我为模型创建了扩展方法:
public static class ExtensionMethods
{
public static void MapModel<T>(this WebViewPage<T> page) where T : class
{
var models = page.ViewContext.TempData.Where(item => item.Value is T);
if (models.Any())
{
page.ViewData.Model = (T)models.First().Value;
page.ViewContext.TempData.Remove(models.First().Key);
}
}
}
控制器代码:
[HttpPost]
public ActionResult Index(MyModel model)
{
TempData.Add("MyModel", model);
return RedirectToCurrentUmbracoPage();
}
部分查看代码:
@using UmbracoTest.Extension
@using UmbracoTest.Models
@model MyModel
@{
this.MapModel<MyModel>();
}
@using (Html.BeginUmbracoForm("Index", "Home", FormMethod.Post))
{
<div>
@Html.TextBox("Text", Model.Text )
</div>
<input type="submit" name="submit" value="Submit" />
}
答案 1 :(得分:2)
答案是给了我here
所有功劳都归功于Shannon Deminick
后期操作不会为响应返回任何内容(该位对我来说是新的)。 在第二次运行Reset操作之后,由于维护了模型状态,通过传递新实例化的模型,该模型将继承在POST操作(PostReset)中处理的模型的模型状态。
在第二次调用Reset操作时,验证逻辑意味着它永远不会到达返回局部视图的位置。
我暂时绕过了验证逻辑,确定显示了模型验证消息。
答案 2 :(得分:1)
我通过解决命名冲突解决了此错误: