gpt4 book ai didi

asp.net-mvc - umbraco mvc 表面 Controller ,无法从 HttpPost Action 返回 View

转载 作者:行者123 更新时间:2023-12-01 23:57:56 25 4
gpt4 key购买 nike

问题概述:

我创建了一个 Surface Controller ,其中包含使用 @Html.Action(...) 调用的操作。

@Html.Action 调用是在宏部分 View 中完成的,并且使用富文本编辑器将宏包含在页面内容中。

(我对此很陌生,所以如果我以错误的方式处理事情,请告诉我。)

Surface Controller 具有 GET 和 POST 操作,但它是在宏部分中调用的 get 操作。

获取操作渲染良好,在表单中不输入任何数据将使模型状态无效(这是我当前正在测试的)。

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

一切正常...调试时没有遇到异常...

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

我想做的就是返回显示验证消息的同一页面。

详细信息:

Umbraco v6.0.5

我当前正在开发的 Controller 用于重置用户的密码。我还有一个登录 Controller ,它通过使用 RedirectToCurrentUmbracoPage() 来解决此问题。

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

代码位于单独的解决方案中,并且 View 和 bin 目录被复制。使用 nuget 包 UmbracoCMS.Scaffolding。

Controller 代码:

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" />
}

宏部分 View - ~\Views\MacroPartials\ResetPassword.cshtml:

@inherits Umbraco.Web.Macros.PartialViewMacroPage       
@Html.Action("Reset", "ResetPasswordSurface")

感谢任何帮助。

编辑:

从 Reset Action 中删除 [HttpGet] 属性表明,在调用 PostReset 操作后,还会调用 Reset 操作。

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

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

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

最佳答案

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

  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. Controller 代码:

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

     @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" />
    }

关于asp.net-mvc - umbraco mvc 表面 Controller ,无法从 HttpPost Action 返回 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16827552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com