Отображение значений вида в другой вид (MVC) - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть таблица в виде с некоторыми сведениями об автомобиле.После того, как я нажму кнопку «Аренда», чтобы перенаправить меня в другой вид и отобразить там данные выбранной строки.Используя кнопку, которая уже есть в коде, я могу отображать только детали этой строки в URL-адресе, но они не отображаются на странице.

Вот мой список ListOfCars:

@model IEnumerable<CarDataAccess.Car>

@{
ViewBag.Title = "List";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ListCars</title>
<script src="~/Scripts/OnClick.js">

</script>
</head>
<body>
@*<p>
        @Html.ActionLink("Create New", "Post")
    </p>*@



<table class="table">

    <tr>
        <th>
            @Html.DisplayNameFor(model => model.model)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.make)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.location)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.avaStart)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.avaEnd)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.price)
        </th>
        <th>

        </th>


    </tr>

    @foreach (var item in Model)
    {
        <tr>

            <td>
                @Html.DisplayFor(modelItem => item.model)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.make)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.location)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.avaStart)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.avaEnd)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.price)
            </td>

            <td>

            <td>@Html.ActionLink("Rent", "Payment", new { id = item.Id })</td>




            </td>




        </tr>

    }

</table>



<div>
    <a href="http://localhost:6664/User/Login">Login</a>
</div>

А вот другой вид, где я хочу отображать строку:

@model IEnumerable<CarDataAccess.Car>


@{
    /**/

    ViewBag.Title = "Payment";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Payment</title>

</head>
<body>
    <table class="paymenttable">

        
    </table>

    

</body>
</html>

Код контроллера:

namespace RentCarApplication.Controllers
{
public class HomeController : Controller
{
    BookCarDBEntities db = new BookCarDBEntities();
    public ActionResult Index(int? id)
    {

        ViewBag.Title = "Home Page";

        return View();
    }

    public ActionResult ListCars()
    {
        string username = User.Identity.Name;
        var cars = db.Cars.ToList();

        return View(cars);
    }
 public ActionResult Payment(int id)
    {
       using (BookCarDBEntities entities = new BookCarDBEntities())
        {
            var entity = entities.Cars.FirstOrDefault(c => c.Id == id);

            if (entities != null)
            {
                return View(entity);
            }
            else
            {
                return View("Not Found");
            }

        }






    }
}
}

1 Ответ

0 голосов
/ 09 декабря 2018

В действии контроллера Payment(int id) вы передаете одну сущность типа CarDataAccess.Car в представление (строка в вашем коде entities.Cars.FirstOrDefault(c => c.Id == id) получает одну сущность из базы данных).

Представление Payment ожидает коллекцию типа IEnumerable<CarDataAccess.Car>.Вы можете увидеть это в первой строке представления @model IEnumerable<CarDataAccess.Car>.Измените это на @model CarDataAccess.Car и посмотрите, решит ли это проблему.

Обновите представление следующим образом:

@model CarDataAccess.Car 

@{
    /**/

    ViewBag.Title = "Payment";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Payment</title>

    </head>
    <body>
        @* access model properties here *@ 
        <span>@Model.Id</span>


    </body>
</html>

В вашем контроллере тоже есть ошибка.Убедитесь, что сущность Car не пуста, не является контекстом базы данных (entities):

public ActionResult Payment(int id)
{
   using (BookCarDBEntities entities = new BookCarDBEntities())
    {
        var entity = entities.Cars.FirstOrDefault(c => c.Id == id);

        if (entity != null)    // check if entity is null, not entities
        {
            return View(entity);
        }
        else
        {
            return View("Not Found");
        }
    }
}

Также существует другая проблема в вашем контроллере - вы объявили несколько экземпляров контекста базы данных (BookCarDBEntities).Лучше всего заключить контекст вашей базы данных в операторы using, как вы это делали в способе оплаты.Сделайте то же самое для метода ListCars и удалите BookCarDBEntities db = new BookCarDBEntities(); с верхней части контроллера.Если вы заключите контекст в использование операторов, то это гарантирует, что контекст должным образом удаляется и очищается сборщиком мусора.

Метод ListCars должен выглядеть следующим образом:

public ActionResult ListCars()
{
    string username = User.Identity.Name;
    var cars = new List<CarDataAccess.Car>();
    using (var db = new BookCarDBEntities())
    {
        cars = db.Cars.ToList();
    } 
    return View(cars);
}
...