Asp.net mvc umbraco mvc地面控制器,can';t从HttpPost操作返回视图 问题概述:

Asp.net mvc umbraco mvc地面控制器,can';t从HttpPost操作返回视图 问题概述:,asp.net-mvc,forms,http-post,umbraco,Asp.net Mvc,Forms,Http Post,Umbraco,我用@Html.action(…)创建了一个表面控制器,该控制器使用一个调用的动作 @Html.Action调用在宏局部视图中完成,宏包含在使用富文本编辑器的页面内容中 (我是新来的,所以如果我做错了事情,请让我知道。) 曲面控制器有一个GET和一个POST动作,但它是在宏partial中调用的GET动作 Get action渲染很好,在表单中输入任何数据都将使模型状态无效(这是我目前正在测试的) 提交表单(没有输入数据)意味着我可以进入POST操作,ModelState.IsValid设置为f

我用@Html.action(…)创建了一个表面控制器,该控制器使用一个调用的动作

@Html.Action调用在宏局部视图中完成,宏包含在使用富文本编辑器的页面内容中

(我是新来的,所以如果我做错了事情,请让我知道。)

曲面控制器有一个GET和一个POST动作,但它是在宏partial中调用的GET动作

Get action渲染很好,在表单中输入任何数据都将使模型状态无效(这是我目前正在测试的)

提交表单(没有输入数据)意味着我可以进入POST操作,ModelState.IsValid设置为false,并返回CurrentUmbracoPage()

一切都好。。。调试时未遇到异常

此时页面上会出现错误文本“加载部分视图脚本时出错”

我所要做的就是返回相同的页面,并显示验证消息

细节: 翁布拉科v6.0.5

我当前使用的控制器用于重置用户密码。我还有一个登录控制器,它通过使用RedirectToCurrentUmbracoPage()绕过了这个问题

要访问包含宏的页面,我使用地址http://{testhost}/Reset Password 返回的错误文本为:加载部分视图脚本时出错(文件:~/Views/MacroPartials/ResetPassword.cshtml)

代码在一个单独的解决方案中,视图和bin目录被交叉复制。 nuget包UmbracoCMS。使用脚手架

控制器代码: 视图-~\Views\ResetPasswordSurface\Reset.cshtml: 感谢您的帮助

编辑: 从重置操作中删除[HttpGet]属性表明,在调用PostReset操作之后,也将调用重置操作

将PostReset重命名为Reset并将httpget属性重新添加到原始重置操作会导致调用两次post操作。 第二次调用它会导致异常: 使用SurfaceControl表单时,只能在Http POST上下文中使用UmbracoPageResult

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

因此,问题仍然存在。我怎样才能避开这个问题?
我需要返回PostReset操作的结果。

答案已提供给我

所有的功劳都归于香农·德米尼克

post操作不会为响应返回任何内容(这对我来说是新的)。 第二次运行重置操作时,在post之后,由于维护了modelstate,因此通过传递新实例化的模型,此模型将继承post操作(PostReset)中处理的模型的模型状态

在第二次调用重置操作时,验证逻辑意味着它永远不会返回部分视图


我暂时绕过了验证逻辑,果然显示了模型验证消息。

我就是这样解决这个问题的:

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

    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);
          }
       }
    }
    
  • 部分视图代码:

     @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" />
     }
    
    @使用UmbracoTest.Extension
    @使用UmbracoTest.Models
    @模型MyModel
    @{
    这个.MapModel();
    } 
    @使用(Html.BeginUmbracoForm(“Index”,“Home”,FormMethod.Post))
    { 
    @TextBox(“Text”,Model.Text)
    }
    

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

    • 确保GET和POST方法的命名不同
    • 确保控制器名称与任何文档类型都不冲突
    @inherits Umbraco.Web.Macros.PartialViewMacroPage       
    @Html.Action("Reset", "ResetPasswordSurface")
    
    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" />
     }