首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 5多模型

MVC 5多模型
EN

Stack Overflow用户
提问于 2014-04-30 12:48:15
回答 1查看 670关注 0票数 0

是否有可能在一个页面中有多个@Model函数?

我有一个视图/Shared/_layout.cshtml页面,它有以下代码从Server 2012数据库中提取导航:

代码语言:javascript
复制
@model IEnumerable<WebApplication1.navigation_V>

<ul class="nav sf-menu clearfix">
    @foreach (var item in Model) {
        <li>@Html.MenuItem(item.title_TV, item.url_TV, "Home")</li>
    }
</ul>

这对于视图/Home文件夹中的所有视图都很好,但是View/Accounts/Login.cshtml文件有以下代码:

代码语言:javascript
复制
@model WebApplication1.Models.LoginViewModel

现在,当我试图查看Account/Login页面时,我得到了以下错误:

传递到字典中的模型项是'System.Collections.Generic.List`1WebApplication1.navigation_V',类型,但是该字典需要一个类型为'WebApplication1.Models.LoginViewModel‘的模型项。

在编写代码时,我没有得到任何红色下划线,只有在尝试访问帐户/登录页时,错误才会触发。这个导航功能必须可以在所有页面上查看,接下来我担心的是从数据库中获取其余的页面内容到这些页面。

如能提供任何帮助,将不胜感激:)

关于进一步的信息,我已经包含了更多的代码。

代码语言:javascript
复制
WebApplication1Entities.cs

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;

namespace WebApplication1
{    
    public partial class WebApplication1Entities : DbContext
    {
        public WebApplication1Entities()
            : base("name=WebApplication1Entities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<navigation_V> navigation_V { get; set; }
    }
}   

navigation_V.cs

using System;
using System.Collections.Generic;

namespace WebApplication1
{
    public partial class navigation_V
    {
        public int navigation_ID { get; set; }
        public string title_TV { get; set; }
        public string url_TV { get; set; }
    }
}

Controllers/HomeController.cs:

public static class MenuExtensions
{
    public static MvcHtmlString MenuItem(
        this HtmlHelper htmlHelper,
        string text,
        string action,
        string controller
    )
    {
        var li = new TagBuilder("li");
        var routeData = htmlHelper.ViewContext.RouteData;
        var currentAction = routeData.GetRequiredString("action");
        var currentController = routeData.GetRequiredString("controller");
        if (string.Equals(currentAction, action, StringComparison.OrdinalIgnoreCase) &&
            string.Equals(currentController, controller, StringComparison.OrdinalIgnoreCase))
        {
            li.AddCssClass("active");
        }
        li.InnerHtml = htmlHelper.ActionLink(text, action, controller).ToHtmlString();
        return MvcHtmlString.Create(li.ToString());
    }
}

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        private WebApplication1Entities db = new WebApplication1Entities();

        public ActionResult Index()
        {
            return View(db.navigation_V.ToList());
        }
    }
}

Views/Shared/Layout.cshtml

@model IEnumerable<WebApplication1.navigation_V>

<ul class="nav sf-menu clearfix">
    @foreach (var item in Model) {
        <li>@Html.MenuItem(item.title_TV, item.url_TV, "Home")</li>
    }
</ul>

我希望这能让事情更清楚些。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-30 15:15:29

与其在布局中呈现导航IEnumerable,不如在家庭控制器中编写子操作,如下所示:

代码语言:javascript
复制
[ChildActionOnly]
public ActionResult Navigation()
{
    var navigationModel = ..
    // your code to retrieve IEnumerable<WebApplication1.navigation_V>
    // from DB

    return View(navigationModel);
}

此操作的视图为视图/Home/Navigation.cshtml:

代码语言:javascript
复制
@{ Layout = null; } // preventing recursive rendering
@model IEnumerable<WebApplication1.navigation_V>

<ul class="nav sf-menu clearfix">
    @foreach (var item in Model) {
        <li>@Html.MenuItem(item.title_TV, item.url_TV, "Home")</li>
    }
</ul>

_layout.cshtml的代码,将旧的导航代码替换为以下代码:

代码语言:javascript
复制
@{ Html.RenderAction("Navigation", "Home"); }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23388556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档