MVC3模型在布局中作为部分

时间:2012-08-21 10:37:29

标签: c# asp.net-mvc-3 model partial-views

我正在尝试在我的项目中使用MVC3模型验证,但是如果用户没有登录,我希望在布局中始终显示一个简单的登录部分。我占大多数代码到位,但我唯一能坚持的是如何将模型发布回表单以获取我生成并需要返回的任何验证消息。

通常这样的事情会起作用:

public ActionResult Login()
{
    return View();
}

[HttpPost]

public ActionResult Login(LoginModel)
{
    if(ModelState.IsValid())
    {
        //Run Further checks & functions
        //Upon successful login, retuns to somewhere (Just site index in this example)
        return RedirectToAction("Index", "Site");
    }

    return View(model);
}

现在显然这不起作用,因为我不能return View(model);部分,除非我只是想要显示登录表单,但我希望它回发到我一直在编辑的页面。例如:我导航到某个页面,与我们联系,并希望立即登录。我在始终可用的表单上输入我的详细信息,然后输入我的详细信息。发生错误(密码不正确,登录不正确,帐户不存在等等),我应该返回到联系页面,表格中仍然填写了我输入的详细信息(显然密码除外),并附有验证摘要工作等...

此外,页面上布局已呈现的任何表单仍需要正常工作(使用模型等)

我愿意接受有关如何通过其他提交/返回方式使其工作的建议,但是将MVC模型验证工作是理想的。

如果有人需要我详细说明任何内容,请随时发表评论。我会积极回应一段时间。

2 个答案:

答案 0 :(得分:0)

请参阅此问题:How do I pass value to MVC3 master page ( _layout)? 有完整的指南如何将模型传递给布局

答案 1 :(得分:0)

你应该为登录创建一个局部视图而不是使用“@ Html.BeginForm”使用@ Html.AjaxBegin,它通过Ajax调用提交你的页面,并且登录视图的 RenderHtmlString 。 例如

public ActionResult Login(LoginModel)
{
    if(ModelState.IsValid())
    {
        //Run Further checks & functions
        //Upon successful login, retuns to somewhere (Just site index in this example)
        return RedirectToAction("Index", "Site");
    }

    return RenderPartialViewToString("Login",model);
}

protected string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            return sw.GetStringBuilder().ToString();
        }
    }

添加“RenderPartialViewToString”方法后,将返回部分视图的“ RenderHtmlString ”。您必须将viewName和Model作为参数传递给此方法。 在你的部分视图中。

<div id="targetId">
</div>

@using(Ajax.BeginForm("Login",new AjaxOptions{ HttpMethod="POST", UpdateTargetId="targetId"}))
{
  <input type="submit" value="save" />
}

注意:您必须通过UpdateTargetId,结果将附加。