MVC3模型局部布局



截至目前,我正在尝试在我的项目中使用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模型验证发挥作用是理想的。

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

您应该创建一个用于登录的部分视图,而不是使用"@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作为参数传递给此方法。在您的partail视图中。

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

注意:您必须在那里传递UpdateTargetId,您的结果将追加。

请参阅以下问题:如何将值传递到MVC3主页面(_layout)?有完整的指南可以将模型传递给布局

最新更新