强类型布局和强类型页面,想要使用它

时间:2011-08-09 21:15:01

标签: asp.net-mvc-3

我在Asp.NET MVC应用程序中遇到架构和传递模型的问题... 事情就是这样。

我创建了强类型布局,因为我在布局中有登录面板(作为局部视图),这需要他的模型。 现在我有一些观点(注册和联系页面),使用这种布局,我不知道如何将它们传递给他们的模型...

我的问题是如何解决这个问题,例如通过另一个构建,但可能没有加倍代码。构建具有所有可能的模型的ViewModel使用此布局的页面看起来不像一个选项(即使有某种方法可以将模型进一步传递给@RenderBody())。

我的代码

登录面板(部分视图)

@model Models.Home.LoginModel
@{
    ViewBag.Title = "Login";
}
@using (Ajax.BeginForm(new AjaxOptions() { UpdateTargetId = "login" }))
{
    //some form fields here
}

布局

@model Models.Home.LoginModel
<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <div id="login">
        @Html.Partial("Account/_Login", @Model)
    </div>
    <div id="main">
        @RenderBody()
    </div>
</body>

网页

@model Models.Home.RegisterModel
@{
    ViewBag.Title = "Registration";
}
@using (Ajax.BeginForm(new AjaxOptions() { UpdateTargetId = "registerDialog" }))
{
    //some form fields here
}

登录控制器操作

[HttpPost]
public ActionResult Index(LoginModel model, string returnUrl)
{
    // If we got this far, something failed, redisplay form
    if (Request.IsAjaxRequest())
    {
        return PartialView("Account/_Login", model);
    }
    else
    {
        return View(model);
    }
}

注册的控制器操作

[HttpPost]
public ActionResult Register(RegisterModel registerModel)
{
    return View(registerModel);
}

我通过删除不必要的代码行简化了所有内容。

1 个答案:

答案 0 :(得分:3)

在不重复代码的情况下执行此操作的最简单方法可能是使用子操作(而不是部分视图)实现登录逻辑。

子操作就像部分视图,但它们也有自己的控制器方法,可用于加载局部视图所需的所有模型。

一个例子:

<强>控制器

[ChildActionOnly]
public ActionResult Login() {
     LoginModel model;
     // do login check, set model
     return View("_Login", model);
}

<强>布局

<body>
<div class="header">@Html.Action("Login")</div>
@RenderBody()
</body>

<强> _Login.cshtml

@model LoginModel
@if(Model.IsLoggedIn) {
    <text>Welcome @Model.UserName</text>
} else {
    .. do ajax form stuff here ...
}