gpt4 book ai didi

asp.net-mvc - ASP.Net MVC 部分 View 保持其模型状态?

转载 作者:行者123 更新时间:2023-12-04 04:27:40 25 4
gpt4 key购买 nike

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

当我创建一个 ASP.NET MVC2 应用程序时,会创建一个带有 Action LogIn 的帐户 Controller ,如下所示:

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

正在杀了我。
我想要的是回到我的主页(称之为主页/索引),但带有部分 View 的错误信息。
return RedirectToAction("Index", "Home")

显然行不通。

提示?

最佳答案

这当然不是一个新手问题,我已经在网上上下梳理了这个问题的答案,到目前为止,我发现的最佳解决方案有点隐藏在本教程中 here .这就是 Darin Dimitrov 对 Ajax 更新的建议。我将总结该链接的重要部分以及为什么这不容易修复:/

基于怪异情人的Ajax刷新

ajax 刷新的解决方案几乎取决于以下功能(奇怪的情人使用 ControllerContext,但它对我来说不存在,所以我有 ControllerExtension):

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

这个函数是你的模型+模型状态并将你的部分 View 重新呈现为一个 html 字符串。然后,您可以获取该字符串并将其以 json 对象的形式发送回某些 javascript 以刷新 View 。我使用了 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解释:
  • 查找包含我的部分 (class="partial") 的 div 并在该 div 中找到表单
  • 使用该表单取消绑定(bind)任何其他“提交”事件(在我取消绑定(bind)之前,我遇到了一些奇怪的双重提交错误)。
  • 使用“live”,一旦内容被替换,它会再次重新绑定(bind)
  • 一旦我们输入函数 partialViewUpdate...
  • 防止表单完成提交,以便它可以由 ajax 处理。
  • 获取包含我的部分的 div(稍后将使用它)
  • 通过从表单 $(this).attr("action")
  • 中获取 jquery post url 来设置它
  • 采取形式(即我们的模型)并将其序列化以用于 Controller 功能 $(this).serialize()
  • 创建将处理 ajax 返回值的函数。
  • 我使用我自己的个人 json 对象,其中 StatusCode 1 不好。因此,如果它不好,那么我会采用 Content 中的内容,这是 RenderPartialViewToString 给我的字符串,我只需替换包含我的部分的 div 的内容。

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

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

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

    说它不是

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

    关于asp.net-mvc - ASP.Net MVC 部分 View 保持其模型状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3080983/

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