umbraco mvc表面控制器,无法从HttpPost Action返回视图

时间:2013-05-30 03:41:23

标签: asp.net-mvc forms http-post umbraco

问题概述:

我创建了一个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动作两次。 第二次调用会导致异常: 在使用SurfaceController表单时,只能在Http POST的上下文中使用UmbracoPageResult

我已经恢复了更改,所以我在PostReset操作后调用Reset([HttpGet])。

所以问题仍然存在。我该如何解决这个问题? 我需要从PostReset Action返回结果。

3 个答案:

答案 0 :(得分:9)

这就是我解决这个问题的方法:

  1. 我为模型创建了扩展方法:

    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);
          }
       }
    }
    
  2. 控制器代码:

    [HttpPost]
    public ActionResult Index(MyModel model)
    {
        TempData.Add("MyModel", model);
        return RedirectToCurrentUmbracoPage();
    } 
    
  3. 部分查看代码:

     @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)

我通过解决命名冲突解决了此错误:

  • 确保GET和POST方法的名称不同
  • 确保控制器名称不与任何文档类型冲突