ASP.Net MVC 部分视图保持其模型状态?

2024-04-26

这可能又是一个新手问题。

当我创建 ASP.NET MVC2 应用程序时,会创建一个具有操作登录的帐户控制器,如下所示:

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
   if (ModelState.IsValid)
   {
      if (MembershipService.ValidateUser(model.UserName, model.Password))
      {
         FormsService.SignIn(model.UserName, model.RememberMe);
         if (!String.IsNullOrEmpty(returnUrl))
         {
            return Redirect(returnUrl);
         }
         else
         {
           return RedirectToAction("Index", "Home");
         }
       }
       else
       {
          ModelState.AddModelError("", "The user name or password provided is incorrect.");
       }
     }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

现在,我不想有登录页面,我想将登录控件作为更大页面的一部分。因此,我将 Login.aspx 更改为 Login.ascx,并将其与 Html.RenderPartial 或 Html.RenderAction 集成到我的主视图中。

两者的工作原理就像登录成功一样。如果不是,则

return View(model)

快要死了。 我想要的是返回到我的主页(称为主页/索引),但带有部分视图的错误信息。

return RedirectToAction("Index", "Home")

显然是行不通的。

Hints?


这当然不是一个新手问题,我已经在网上上下梳理了这个问题的答案,到目前为止,我发现的最好的解决方案有点隐藏在本教程中here http://www.weirdlover.com/2010/05/14/mvc-render-partial-modal-pop-up-via-jquery-and-colorbox-part-1/。这就是达林·迪米特洛夫 (Darin Dimitrov) 在阿贾克斯更新中所建议的。我将总结该链接的重要部分以及为什么这不容易修复:/

基于奇怪情人的Ajax刷新

ajax刷新的解决方案很大程度上取决于以下功能(奇怪的爱好者使用ControllerContext,但它对我来说不存在,所以我有控制器扩展):

ControllerExtension.RenderPartialViewToString(this,"mypartial", (object)model)

该函数采用模型+模型状态并将部分视图重新呈现为 html 字符串。然后,您可以获取该字符串并将其以 json 对象形式发送回某些 javascript 以刷新视图。我用了jquery,它看起来像这样,

$(document).ready(function () {
    var partialViewUpdate = function (e) {
            e.preventDefault(); //no postback
            var partialDiv = $(this).parent(".partial");
            $.post($(this).attr("action"),
                   $(this).serialize(),
                   function (json) {
                   if (json.StatusCode != 0) {
                       // invalid model, return partial 
                       partialDiv.replaceWith(json.Content);
                   }
                   else if (json.Content != null && json.Content != "") {
                       window.location.replace(data.Content);
                   };
           });

    $(".partial").find("form")
                 .unbind('submit')
                 .live("submit", partialViewUpdate);
};

jquery解释:

  1. 查找包含我的部分 (class="partial") 的 div 并找到该 div 中的表单
  2. 使用该表单取消绑定任何其他“提交”事件(在取消绑定之前,我遇到了一些奇怪的双重提交错误)。
  3. 使用“live”,以便一旦内容被替换,它就会再次重新绑定
  4. 一旦我们进入函数partialViewUpdate...
  5. 阻止表单完成提交,以便全部由ajax处理。
  6. 获取包含我的部分内容的 div(稍后将使用它)
  7. 通过从表单 $(this).attr("action") 获取来设置 jquery post url
  8. 采取形式(即我们的模型)并将其序列化为控制器函数 $(this).serialize()
  9. 创建将处理 ajax 返回值的函数。
  10. 我使用我自己的个人 json 对象,其中 StatusCode 1 是错误的。因此,如果它很糟糕,那么我会采用 Content 中的内容,这就是字符串渲染部分视图到字符串给了我,我只是替换了包含我的部分的 div 的内容。

为什么它不能正常“工作”

因此,部分视图不仅仅适用于模型状态验证的原因是,您无法使用 POST 返回 View(model),因为 MVC 会将其解析为部分视图 (login.ascx) 的路由地址,而不是部分嵌入(index.aspx)。

您也不能使用 RedirectAction(),因为这会将其发送到 (index.aspx) 控制器函数,这相当于清除所有内容并刷新 index.aspx 页面。但是,如果您使用 Chino 和 Thabaza 建议的 ActionFilter,那么当刷新页面并且再次触发 login.ascx 控制器功能时,它将获取该临时数据。然而,如果刷新页面导致客户端代码(例如弹出模式)出现麻烦(即,如果刷新弹出窗口就消失了),则此方法不起作用。

说不是这样

我希望它“刚刚起作用”,所以如果有人知道正确/更好的方法,请分享它!我仍然觉得 Ajax 刷新和 ActionFilter 解决方案不是一种干净的方法,因为它几乎使它看起来像带有表单的部分视图,如果没有某种“技巧”就不可能使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net MVC 部分视图保持其模型状态? 的相关文章

随机推荐

  • 使用 Jackson 对 List 进行自定义反序列化

    我正在尝试编写一个自定义反序列化器 以便减少从其他地方收到的大量数据 我从反序列化器返回自定义对象列表 我的问题是 如果这是我的自定义反序列化器 我该怎么做 public class MyCustomDeserializer extends
  • 如何避免Spring的@RequestMapping路径冲突?

    我想使用 Spring 定义 REST API 我有这 2 个 Controller 方法 RequestMapping value machineId workspaces workspaceId method RequestMethod
  • 从左到右和从右到左滑动图像

    我正在开发一个应用程序 我想在其中添加可以从左到右和从右到左滑动的图像 如下图所示 内部的白色游戏图像应该从左到右移动 反之亦然 到目前为止我所做的是 我能够从左到右移动单个图像 反之亦然 但我想要设置背景图像 就像上面的圆形黑色背景一样
  • 更改 Mac 上的默认 python 版本 - 安装 Biopython

    我的 Mac 预装了 python 2 7 作为默认的 python 版本 但是 许多软件包和软件不再支持该版本 我搜索了几个在线论坛 了解如何更改 mac 上的默认 python 版本 但是 它们似乎都不起作用 我还安装了最新版本的 py
  • 如何使用 Validators 类在 Angular2 中显示不同的电子邮件验证消息?

    我在用表格组 表单生成器 and 验证者类来验证 Angular2 应用程序中的表单 这就是我定义电子邮件和密码验证所需的验证规则的方式 export class LoginComponent implements OnInit login
  • 在 mac OS X 上挂载批准回调

    我想在 Mac OS X 上授权 USB CD 现在我使用 DiskArbitration 框架在用户模式下获取 MountApprovalCallback 但这个回调的问题在于它没有保证 如果我会得到回调我正在使用CFUserNotifi
  • Twig 用实体替换非 ASCII 字符

    嗯 这真的很奇怪 Twig 我在 Symfony 3 中使用它 将非 ascii 字符 例如 替换为实体 例如 322 但是 仅在 Javascript 部分 我不知道为什么以及如何禁用它 编辑 是的 我在 Netbeans 和 HTML
  • node_modules/@types/googlemaps/index.d.ts 中出现错误 - 元组类型元素列表不能为空

    在尝试整合的同时角度谷歌地图 agm在我的 Angular 项目中 我收到此错误 某些配置有问题或者可能是我错过了一些东西我正在这个项目中使用材料 6 和角度 6 感谢您的帮助 在终端控制台中 ERROR in node modules t
  • Java 用户帐户管理解决方案

    我目前正在开发一个依赖权限机制来管理用户内容的 Java Web 应用程序 这当然意味着我们需要管理用户 我们当前的用户管理系统是一个内部系统 用于管理 RDBMS 中有关用户 组以及用户和权限的信息 该系统可以工作 但维护起来很麻烦 我想
  • HTML 时间输入类型 - 如何在单击任意位置而不仅仅是单击时钟图标时选择时间菜单视图

    I working on the time input type in HTML my problem is when I click on the small clock icon on the right side of the inp
  • AES-256 加密和 Apple iTunes 导出限制

    我有一个很大的问题 我开发了 3 个应用程序 2 个用于 IOS 1 个用于 mac osx 来加密文件RNCryptor https github com rnapier RNCryptor 女巫是一个CCCryptor AES 加密 包
  • CUDA Visual Studio 2010 Express 构建错误

    我正在尝试在 64 位 Windows 7 上使用 Visual Studio 2010 Express 在 Windows 上开始 CUDA 编程 我花了一段时间来设置环境 然后我刚刚编写了我的第一个程序 helloWorld cu 目前
  • EntityDataSource 在查询中将 * 替换为 % 通配符

    我有一个在很多地方使用 EntityDataSource 的应用程序 在 EDS 中 我根据 TextBox 中的用户输入手动构建Where 子句 我希望用户在查询数据时能够输入 星号 而不是 有没有像使用 Entity SQL 或 EDS
  • .crx 文件在 Chrome 中安装

    我刚刚创建了一个非常简单的 chrome 扩展 它运行良好 但是当我转换为 crx 文件并尝试用 chrome 打开它时 没有任何反应 我的chrome浏览器版本是19 0 1081 2 dev m 我的扩展使用jquery 1 4 2 m
  • NSFileHandle writeData:异常处理

    这可能是一个相当广泛的问题 但我找不到任何在线资源来解决或解释这个问题 问题是创建后NSFileHandle writer NSFileHandle fileHandleForWritingAtPath path 当你使用 writer w
  • Pandas.DataFrame interpolate() 方法='线性'和'最近'返回尾随 NaN 不一致的结果

    我在探索pandas DataFrame interpolate 用不同的方法 linear vs nearest 当尾部缺少数据时 我发现这两种方法的输出不同 例如 import pandas as pd version 0 16 2 o
  • Ruby on Rails 3:如何分别检索 POST 和 GET 参数?

    我知道你可以使用获取参数params 但问题是它合并了所有参数 无论它们是通过GET or POST 如果您通过以下方式发送请求GET 没问题 参数只能挤在URL里 但如果你发送一个POST具有类似 URL 的请求 blabla foo b
  • Puppeteer 无法在谷歌云功能中工作

    Puppeteer 无法在谷歌云中工作 镀铬错误如图所示 我已经在这里实施了该建议 Heroku 上的 Puppeteer 错误 找不到 Chromium https stackoverflow com questions 74385208
  • 致命信号11(和引擎项目)

    我正在创建由 andengine 框架提供支持的 android 游戏 box2d 扩展我收到 致命信号 11 这似乎是突然发生的 我想你可以随机称呼它 没有任何线索 至少 我不知道有任何线索可以帮助我解决这个问题 我的猜测是 1 我正在使
  • ASP.Net MVC 部分视图保持其模型状态?

    这可能又是一个新手问题 当我创建 ASP NET MVC2 应用程序时 会创建一个具有操作登录的帐户控制器 如下所示 HttpPost public ActionResult LogOn LogOnModel model string re