为什么我无法从MVC访问新产品列表?

时间:2011-12-13 12:19:32

标签: c# asp.net-mvc

嗨!我尝试学习Asp.net MVC.i创建了一个示例应用程序来学习它。但按f5返回服务器错误。我哪里犯了错误?问题出在哪儿?有一个导航栏Home / About / Product。如果我按产品,错误会返回给我。

enter image description here Cotroller:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models.Db;

namespace MvcApplication1.Controllers
{
    public class ProductsController : Controller
    {
        //
        // GET: /Products/

        public ActionResult GetAll()
        {
            using (var ctx = new MyDbEntities())
            {
                ViewData["Products"] = ctx.Products;
                return View();
            }

        }

    }
}

查看:


<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Db.Product>" %>
<%@ Import Namespace="MvcApplication1.Models.Db" %>
<%@ Import Namespace="MvcApplication1.Controllers" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    ProductDetail
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>ProductDetail</h2>
    <ul>

<% foreach (var m in (IEnumerable<Products>)ViewData["Products"])
     { %>

     <li><%= m.ProductName %></li>

<% } %>
</ul>

</asp:Content>

的Site.Master:



            <div id="menucontainer">

                <ul id="menu">              
                    <li><%: Html.ActionLink("Home", "Index", "Home")%></li>
                    <li><%: Html.ActionLink("About", "About", "Home")%></li>
                     <li><%: Html.ActionLink("Product", "ProductDetail", "Product")%></li>
                </ul>

            </div>

6 个答案:

答案 0 :(得分:3)

<%: Html.ActionLink("Product", "ProductDetail", "Product")%>

操作名称ProductDetail不在您的控制器中,您具有GetAll操作名称

你需要

 public ActionResult ProductDetail()
    {
        using (var db = new NorthwindEntities())
        {
            return View(db.Products.ToList());
        }
    }

答案 1 :(得分:2)

您能提供更多信息,例如实际的服务器错误吗?

快速查看代码视图名称错误。 转到/ Products /期望一个名为Products的视图而不是产品详细信息。

答案 2 :(得分:1)

Controller名称和View文件夹名称不匹配。也在Action名称和View名称之间。

产品控制器 - &gt; 产品视图中的文件夹

GetAll 操作 - &gt; ProductDetail.aspx 查看

重命名为:

产品控制器 - &gt;视图中的产品文件夹

ProductDetail 操作 - &gt; ProductDetail.aspx查看

另外,请记下这一行:

ViewData["Products"] = ctx.Products;
像这样:

ViewData["Products"] = ctx.Products.ToList();

您的观点不应该是对数据库的调用。

答案 3 :(得分:0)

假设您正在进行默认路由。

  1. 问题是您的控制器名为ProductsController(复数)。将名称更改为ProductController或将视图文件夹的名称更改为Products

  2. 另一个问题是您的Controller不包含ActionMethod ProductDetail, 指向site.Master

  3. ProductController.ProductDetail中的链接

    如果您想学习Asp.NET Mvc,我建议您查看以下教程。

    希望这会有所帮助

答案 4 :(得分:0)

首先,尝试更具体。你得到什么错误?

现在,我想我看到了问题所在,但我只是在猜测,因为你没有发布错误。对于我所看到的,您将传递给IQueryable视图:ctx.Products而不枚举它。

然后视图尝试枚举它,但是上下文被释放,因此查询无法运行。我猜你得到的错误就像“上下文不可用”或类似的东西。

首先,尝试更改这样的语句:ctx.Products.ToList()并查看错误是否消失。

我发现你使用字典的另一件事是,使用强类型的ViewModel会好得多(或者至少使用动态)。

答案 5 :(得分:0)

如果您未指定视图名称,则应用程序将查找具有您的方法名称的视图。即:

public ActionResult GetAll()
    {
        using (var ctx = new MyDbEntities())
        {
            ViewData["Products"] = ctx.Products;
            return View();
        }

    }

正在寻找一个视图“Product / GetAll.aspx”。解决方案:

  • 更改方法的名称
  • 更改视图名称
  • 通过执行return View("ProductDetail");
  • 指定视图名称