C# MVC 3问题中的嵌套视图

C# MVC 3问题中的嵌套视图,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我在MVC 3体系结构中设置一些嵌套视图时遇到问题。这就是我目前拥有的: _Layout.cshtml Logon.cshtml Login.cshtml ForgotPassword.cshtml 所以基本上,我有我的_Layout.cshtml页面,它只是我的母版页。然后我有Logon.cshtml。这将作为登录页的“母版页”。在这下面,我有两个部分视图,Login.cshtml和ForgotPassword.cshtml。在这一切的背后,我有一个名

我在MVC 3体系结构中设置一些嵌套视图时遇到问题。这就是我目前拥有的:

_Layout.cshtml
    Logon.cshtml
        Login.cshtml
        ForgotPassword.cshtml
所以基本上,我有我的_Layout.cshtml页面,它只是我的母版页。然后我有Logon.cshtml。这将作为登录页的“母版页”。在这下面,我有两个部分视图,Login.cshtml和ForgotPassword.cshtml。在这一切的背后,我有一个名为AccountController的控制器。首先,让我向您展示Logon.cshtml

@model Coltrane.Web.Website.Models.Account.LogonViewModel
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "Logon";
}
@*@this.CssIncludes(@Url.Content("~/Content/login.css"))*@
@this.ScriptIncludes(@Url.Content("~/Content/scripts/Account/logon.js"))
@this.InitFunctionIncludes("lga_loginTabs.init()")
@this.InitFunctionIncludes("lga_formFocus.init()")
<div id="container">
    <div class="sectionFocus noBg">
        <div style="margin: 24px auto; width: 450px;">
            <div class="customerLogo" style="margin: 24px auto;">
                logo
            </div>
            <div id="tabContainer" style="position: relative; width:100%;">
                <div id="login" class="box_c" style="position:absolute; width:100%;">
                    <h1>User Login</h1>
                    <div class="box_c_content">
                        <div class="sepH_c">
                            @{ Html.RenderAction("Login", "Account"); }
                            <a href="#" id="gotoFogot">Forgot your password?</a>
                        </div>
                    </div>
                </div>
                <div id="forgot" class="box_c" style="position: absolute; width:100%;display: none;">
                    <h1>Forgot Your Password?</h1>
                    <div class="box_c_content">
                        <div class="sepH_c">
                            @{ Html.RenderAction("ForgotPassword", "Account"); }
                            <a href="#" id="gotoLogin">Back to Login</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
Views/Account/Logon.cshtml

@model Coltrane.Web.Website.Models.Account.LogonViewModel
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "Logon";
}
@*@this.CssIncludes(@Url.Content("~/Content/login.css"))*@
@this.ScriptIncludes(@Url.Content("~/Content/scripts/Account/logon.js"))
@this.InitFunctionIncludes("lga_loginTabs.init()")
@this.InitFunctionIncludes("lga_formFocus.init()")
<div id="container">
    <div class="sectionFocus noBg">
        <div style="margin: 24px auto; width: 450px;">
            <div class="customerLogo" style="margin: 24px auto;">
                logo
            </div>
            <div id="tabContainer" style="position: relative; width:100%;">
                <div id="login" class="box_c" style="position:absolute; width:100%;">
                    <h1>User Login</h1>
                    <div class="box_c_content">
                        <div class="sepH_c">
                            @{ Html.RenderAction("Login", "Account"); }
                            <a href="#" id="gotoFogot">Forgot your password?</a>
                        </div>
                    </div>
                </div>
                <div id="forgot" class="box_c" style="position: absolute; width:100%;display: none;">
                    <h1>Forgot Your Password?</h1>
                    <div class="box_c_content">
                        <div class="sepH_c">
                            @{ Html.RenderAction("ForgotPassword", "Account"); }
                            <a href="#" id="gotoLogin">Back to Login</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
在方法[HttpPost]登录(…)上,我正在检查用户信誉是否正确。如果是这样,一切正常,但问题出在错误上。如果我使用
返回视图(“登录”)
我认为我得到了一个无限循环,如果我使用
返回视图(模型)
我得到Login.cshtml的部分视图,如果我使用
返回重定向到操作(“索引”,“主页”),我将正确返回到登录视图,但我添加的错误不会显示(当我
返回视图(模型)时,它们会显示);
。我在这里做错了什么?我认为我的设置是有意义的,但我不知道如何使它正常工作。我希望返回以呈现带有错误的Logon.cshtml视图。为了完整起见,以下是我提供的视图的两个视图模型:

public class LogonViewModel
{
}

public class LoginViewModel
{
    [Required]
    [Display(Name = "Email")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember Me?")]
    public bool RememberMe { get; set; }
}

在我看来,最好的处理方法是重定向回索引页。但是正如你所提到的,这会导致你的错误丢失

不过,有一个很好的解决方案-将模型状态保存在TempData中,然后在索引页面上重新导入。这里有一个链接,提供了一些很好的属性,可以用来实现无缝连接:
[ImportModelStateFromTempData]
[ExportModelStateToTempData]


我认为问题在于您使用的方法

@Html.RenderAction("Login", "Account")
将始终调用GET Login,它没有与之关联的数据

尝试使用:

@Html.RenderPartial("Login","Account", Model.LoginModel)
其中模型为LogonViewModel,LoginModel为LoginViewModel

您的LogonViewModel将成为:

public class LogonViewModel
{
    public LoginViewModel LoginModel { get; set; }
}
然后在AccountController中,您可以执行以下操作:

    var logonModel = new LogonViewModel();
    logonModel.LoginModel = model;

    return View("Logon", logonModel);

太棒了!我更接近了!在ImportModelStateFromTempData上,我可以看到它在呈现Logon.cshtml时出现此错误,但在呈现Login.cshtml(子部分视图)时出现错误,它击中了else并将其删除。因此,我需要错误的视图仍然丢失。父视图基本上正在吞噬它们。想法?@Tyler-简单的解决方法是更改
if
语句,检查结果是否为
ViewResultBase
类型,而不是
ViewResult
,因为b其他
ViewResult
PartialViewResult
extend
ViewResultBase
。但是,如果您的其他部分视图也有显示错误的区域,它们可能会显示两次。另一种方法是只在Logon.cshtml而不是Login.cshtml上显示两个部分的错误。谢谢您的帮助。我结束了我们的讨论正在考虑您关于使用ViewResultBase的建议。我通过添加一个带有在导出时引发错误的操作名称的tempdata值来防止出现重复的错误显示。导入筛选器仅在当前操作与tempdata中的操作匹配时才合并模型状态。我可能还会创建另一个只导入/导出bub的筛选器使用ViewResult将错误添加到父视图。再次感谢!
    var logonModel = new LogonViewModel();
    logonModel.LoginModel = model;

    return View("Logon", logonModel);