我在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);
}
我通过删除不必要的代码行简化了所有内容。
答案 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 ...
}