【问题标题】:how to solve : foreach statement cannot operate如何解决:foreach 语句无法运行
【发布时间】:2016-02-04 19:14:10
【问题描述】:

我有一个名为“BookController”的控制器:

public ActionResult Book(int? id)
    {

        var result = db.Books.Where(b => b.Book_id == id).Single();
        var user = db.AspNetUsers.Where(b => b.Id == result.User_ID).Single();
        ViewBag.User_ID = user.UserName;
        return View(result);
    }

public ActionResult SameAuthor(string author)
        {

            var result = db.Books.Where(b => b.Author_name == author).Take(4);
             return View(result.ToList());
        }

这也是视图代码“books.cshtml”:

@model SmartBookLibrary.Models.Book
@using SmartBookLibrary.Controllers
@{
    ViewBag.Title = Model.Book_name;
    BookController book = new BookController();
    var auth = Model.Author_name;
}
@section AdditionalMeta
{
<link href="~/Content/blog-post.css" rel="stylesheet" />
<link href="~/Content/font-awesome.min.css" rel="stylesheet" />
}
<div class="container">

    <div class="row">

        <!-- Blog Post Content Column -->
        <div class="col-lg-8">

            <!-- Blog Post -->
            <!-- Title -->
            <h1>@Model.Book_name (@Model.Edition th Edition)  <a href="~/Admin/books/edit/@Model.Book_id"><small class="fa fa-edit"></small></a></h1>

            <!-- Author -->
            <p class="lead">
                by <a href="#">@ViewBag.User_ID</a>
            </p>

            <hr>

            <!-- Date/Time -->
            <p><span class="glyphicon glyphicon-time"></span> Posted on @Model.Publish_date</p>

            <hr>

            <!-- Preview Image -->
            <div class="row">
                <div class="col-md-3">
                    <img class="img-show" src="/Books/RetrieveImage/@Model.Book_id" alt="">
                </div>
                <div class="col-md-6 col-md-offset-1">
                    <dl>Book Name : @Model.Book_name</dl>
                    <dl>Book Edition : @Model.Edition</dl>
                    <dl>Author Name : @Model.Author_name</dl>
                    <dl>Category : @Model.Category.Category_name</dl>
                    <dl>Book Name: @Model.Book_name</dl>
                    <dl>ISN : 2015</dl>
                </div>
            </div>                    

            <hr>

            <!-- Post Content -->

            <p class="lead">@Html.Raw(Model.Book_Description)</p>



            <button class="btn btn-block btn-lg btn-success">
                Download @Model.Book_name
                <i class="fa fa-cloud-download"></i>
            </button>     




            <hr>
            <div class="well">
                <div class="row">
                    @*   I Want to call the contoller method , it will return 4 post , then i want to show them here   *@
                    @{
                        var b = book.SameAuthor(auth);
                        foreach (var cat in b)
                        {
                            <div class="col-sm-6 col-md-3">
                                <div class="thumbnail">
                                    <img src="/Books/RetrieveImage/" alt="Generic placeholder thumbnail">
                                </div>

                                <div class="caption">
                                    <h3>Book_name</h3>
                                    <p>Some sample text. Some sample text.</p>

                                    <p>
                                        <a href="#" class="btn btn-primary" role="button">
                                            Button
                                        </a>

                                        <a href="#" class="btn btn-default" role="button">
                                            Button
                                        </a>
                                    </p>

                                </div>
                            </div>
                        }
                    }


                </div>

            </div>
            <hr>
            <!-- Blog Comments -->
            <!-- Comments Form -->
            <div class="well">
                <h4>Leave a Comment:</h4>
                <form role="form">
                    <div class="form-group">
                        <textarea class="form-control" rows="3"></textarea>
                    </div>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </form>
            </div>

            <hr>

            <!-- Posted Comments -->
            <!-- Comment -->
            <div class="media">
                <a class="pull-left" href="#">
                    <img class="media-object" src="http://placehold.it/64x64" alt="">
                </a>
                <div class="media-body">
                    <h4 class="media-heading">
                        Start Bootstrap
                        <small>August 25, 2014 at 9:30 PM</small>
                    </h4>
                    Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.
                </div>
            </div>

            <!-- Comment -->
            <div class="media">
                <a class="pull-left" href="#">
                    <img class="media-object" src="http://placehold.it/64x64" alt="">
                </a>
                <div class="media-body">
                    <h4 class="media-heading">
                        Start Bootstrap
                        <small>August 25, 2014 at 9:30 PM</small>
                    </h4>
                    Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.
                    <!-- Nested Comment -->
                    <div class="media">
                        <a class="pull-left" href="#">
                            <img class="media-object" src="http://placehold.it/64x64" alt="">
                        </a>
                        <div class="media-body">
                            <h4 class="media-heading">
                                Nested Start Bootstrap
                                <small>August 25, 2014 at 9:30 PM</small>
                            </h4>
                            Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.
                        </div>
                    </div>
                    <!-- End Nested Comment -->
                </div>
            </div>

        </div>

        <!-- Blog Sidebar Widgets Column -->
        <div class="col-md-4">

            <!-- Blog Search Well -->
            <div class="well">
                <h4>Search</h4>
                <div class="input-group">
                    <input type="text" class="form-control">
                    <span class="input-group-btn">
                        <button class="btn btn-default" type="button">
                            <span class="glyphicon glyphicon-search"></span>
                        </button>
                    </span>
                </div>
                <!-- /.input-group -->
            </div>

            <!-- Blog Categories Well -->
            <div class="well">
                <h4>Blog Categories</h4>
                <div class="row">
                    <div class="col-lg-6">
                        <ul class="list-unstyled">
                            <li>
                                <a href="#">Category Name</a>
                            </li>
                            <li>
                                <a href="#">Category Name</a>
                            </li>
                            <li>
                                <a href="#">Category Name</a>
                            </li>
                            <li>
                                <a href="#">Category Name</a>
                            </li>
                        </ul>
                    </div>
                    <div class="col-lg-6">
                        <ul class="list-unstyled">
                            <li>
                                <a href="#">Category Name</a>
                            </li>
                            <li>
                                <a href="#">Category Name</a>
                            </li>
                            <li>
                                <a href="#">Category Name</a>
                            </li>
                            <li>
                                <a href="#">Category Name</a>
                            </li>
                        </ul>
                    </div>
                </div>
                <!-- /.row -->
            </div>

            <!-- Side Widget Well -->
            <div class="well">
                <h4>Books May You Interest</h4>
            </div>

        </div>

    </div>
    <!-- /.row -->
</div>

我的问题实际上在此代码“in books.cshtml”中:

 @{
                        var b = book.SameAuthor(auth);
                        foreach (var cat in b)
                        {
                            <div class="col-sm-6 col-md-3">
                                <div class="thumbnail">
                                    <img src="/Books/RetrieveImage/" alt="Generic placeholder thumbnail">
                                </div>

                                <div class="caption">
                                    <h3>Book_name</h3>
                                    <p>Some sample text. Some sample text.</p>

                                    <p>
                                        <a href="#" class="btn btn-primary" role="button">
                                            Button
                                        </a>

                                        <a href="#" class="btn btn-default" role="button">
                                            Button
                                        </a>
                                    </p>

                                </div>
                            </div>
                        }
                    }

我得到的错误是:

Severity    Code    Description Project File    Line    Suppression State
Error   CS1579  foreach statement cannot operate on variables of type 'System.Web.Mvc.ActionResult' because 'System.Web.Mvc.ActionResult' does not contain a public definition for 'GetEnumerator'  SmartBookLibrary    C:\Users\Firas\documents\visual studio 2015\Projects\SmartBookLibrary\SmartBookLibrary\Views\Book\Book.cshtml   73  Active

注意:我尝试将模型类型更改为:

@model IEnumerable <SmartBookLibrary.Models.Book>

错误消失了,但我得到了所有视图代码的错误(任何以@model开头的代码),这是我得到的错误示例:

    Severity    Code    Description Project File    Line    Suppression State
Error   CS1061  'IEnumerable<Book>' does not contain a definition for 'Book_name' and no extension method 'Book_name' accepting a first argument of type 'IEnumerable<Book>' could be found (are you missing a using directive or an assembly reference?)   SmartBookLibrary    C:\Users\Firas\documents\visual studio 2015\Projects\SmartBookLibrary\SmartBookLibrary\Views\Book\Book.cshtml   4   Active

任何人都可以帮助我解决问题!并感谢

【问题讨论】:

  • SameAuthor 你为什么要返回一个视图??

标签: asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

错误是不言自明的。 SameAuthor() 操作方法返回 ActionResult 类型。你不能循环过去!

看起来您的 SameAuthor 操作方法返回了一个包含您想要的数据的视图(标记)。那么为什么不使用 Html.Action 辅助方法将其包含在主视图中

@Html.Action("SameAuthor", Model.Author_name)

或者您应该为您的视图创建一个视图模型,其中包含一本书的详细信息和“来自同一作者的书籍”的书籍集合。

public class BooksDetailsVm
{
    public Book Book { set;get;}
    public List<Book> BooksFromSameAuthor { set;get;}
}

在您的 GET 操作中,加载此数据

public ActionResult Book(int? id)
{
    if (id != null)
    {
        var vm = new BooksDetailsVm();
        var b = db.Books.Where(O => O.Book_id == id).Single();
        vm.Book = b;
        var user = db.AspNetUsers.Where(P => P.Id == b.User_ID).Single();
        vm.BooksFromSameAuthor = db.Books.Where(t => t.Author_name == b.Author_name).Take(4).ToList();
        ViewBag.User_ID = user.UserName;
        return View(vm);
    }
    return HttpNotFound();
}

还有你的视图,它被强类型化到我们的新 BookDetailsVm 中

@model BookDetailsVm
<h1>@Model.Book.Name</h1>
<h4>Books from same author</h4>
@foreach(var item in Model.BooksFromSameAuthor)
{
    <p>@item.Name</p>
}

【讨论】:

  • 谢谢,我相信这很有帮助,但你能告诉我如何在我的代码中使用@Html.Action("SameAuthor",Model.Author_name),因为实际上它是我第一次使用这种方法,我不知道,或者如果你有一个例子,或者你是否可以用这个辅助方法向我展示我的代码,谢谢..
  • 你为什么不在你的主视图中简单地包含那一行(并删除那些你有错误代码的foreach)?
  • 好的,我会试试的,只是因为我还在学习,对不起,我会让你知道我得到了什么。
  • 您好,我使用它并收到此错误:System.Web.dll 中发生“System.Web.HttpException”类型的异常,但未在用户代码中处理附加信息:子项的执行请求失败。请检查 InnerException 以获取更多信息。
  • 它的工作,我在看到你的评论之前就做到了,我尝试在代码中看到你的评论,然后我添加了一个空检查,所以解决了!谢谢先生,我很感激。
猜你喜欢
  • 2022-08-03
  • 1970-01-01
  • 2018-07-04
  • 2022-11-09
  • 2021-09-15
  • 1970-01-01
  • 2014-03-10
  • 2019-01-31
  • 1970-01-01
相关资源
最近更新 更多