Требуется другой тип модели, ASP. NET MVC - PullRequest
0 голосов
/ 03 апреля 2020

Это ошибка, которую я получаю:

InvalidOperationException: элемент модели, передаваемый в ViewDataDictionary, имеет тип 'ProjectOne.Data.ProjectOneContext', но для этого экземпляра ViewDataDictionary требуется элемент модели типа 'ProjectOne.ViewModel.ItemViewModel'.

Это может быть, а может и не быть связано, но я не могу даже подключиться к базе данных, не введя непосредственно мою строку OnConfiguring в мой код. Обычно я могу поместить его в секреты пользователя, appsettings. json или в отдельный файл класса. Но это не работает в appsettings. json, по крайней мере.

Я не уверен, что именно здесь происходит. Я опубликую свой код ниже.

Может кто-нибудь помочь мне с этим? Спасибо!

DBContext:

namespace ProjectOne.Data
{
    public class ProjectOneContext : DbContext
    {
        public ProjectOneContext(){}
        public ProjectOneContext(DbContextOptions<ProjectOneContext> options) : base(options){}

        public DbSet<ProjectOne.Models.Categories> Categories { get; set; }

    }
}

ItemViewModel:

@model ProjectOne.ViewModel.ItemViewModel
@{
    ViewBag["Title"] = "Index";
}

<h1>Index</h1>

<div class="container">
    <div class="col-md-4">
        <div class="form-group">
            Category:
            @Html.DropDownListFor(expression: model => model.CategoryId, new SelectList(Model.CategorySelectListItem, dataValueField: "Value", dataTextField: "Text"), htmlAttributes: new { @class = "form-control" })
        </div>
    </div>
    <div class="col-md-4">
        <div class="form-group">
            Item Code:
            @Html.TextBoxFor(expression: model => model.ItemCode, htmlAttributes: new { @class = "form-control" })
        </div>
    </div>
    <div class="col-md-4">
        <div class="form-group">
            Item Name:
            @Html.TextBoxFor(expression: model => model.ItemName, htmlAttributes: new { @class = "form-control" })
        </div>
    </div>
    <div class="col-md-4">
        <div class="form-group">
            Description:
            @Html.TextBoxFor(expression: model => model.Description, htmlAttributes: new { @class = "form-control" })
        </div>
    </div>
    <div class="col-md-4">
        <div class="form-group">
            Item Price:
            @Html.TextBoxFor(expression: model => model.ItemPrice, htmlAttributes: new { @class = "form-control" })
        </div>
    </div>
    <div class="col-md-4">
        <div class="form-group">
            Image Path:
            @Html.TextBoxFor(expression: model => model.ImagePath, htmlAttributes: new { type = "file", @class = "form-control" })
        </div>
    </div>
</div>

Контроллер элементов:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using ProjectOne.Data;
using ProjectOne.ViewModel;

namespace ProjectOne.Controllers
{
    public class ItemController : Controller
    {
        private readonly ProjectOneContext objECartDBEntities;

        public ItemController()
        {
            objECartDBEntities = new ProjectOneContext();
        }

        public IActionResult Index()
        {
            ItemViewModel objItemViewModel = new ItemViewModel();
            objItemViewModel.CategorySelectListItem = (from objCat in objECartDBEntities.Categories
                                                       select new SelectListItem()
                                                       {
                                                           Text = objCat.CategoryName,
                                                           Value = objCat.CategoryId.ToString(),
                                                           Selected = true

                                                       });
            return View(objECartDBEntities);
        }
    }
}

1 Ответ

1 голос
/ 03 апреля 2020

Ваша страница бритвы ожидает эту модель:

ItemViewModel

@ model ProjectOne.ViewModel.ItemViewModel

, и вы передаете это для просмотра:

return View(objECartDBEntities);

который находится в ProjectOneContext

, вы должны вернуть ItemViewModel

 return View(objItemViewModel);

и никогда не возвращать этот ProjectOneContext, поскольку он содержит конфиденциальные данные. Вы должны вернуть пользовательскую модель, которая только возвращает данные, которые нужны вашей странице

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...