【问题标题】:Invalid Operation Exception: The model item passed into the ViewDataDictionary is of type无效操作异常:传入 ViewDataDictionary 的模型项是类型
【发布时间】:2021-08-27 06:53:10
【问题描述】:

当我将类型模型的表(提示)中的数据列为 partialView 时,我收到此错误。

InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“System.Collections.Generic.List1[RealEstateAspNetCore3._1.Models.Advertisement]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable1[RealEstateAspNetCore3._1.Models.Tip]”。

Tip(类型)包含StatusId作为外键。

Tip.cs 模型类:

    [Key] 
    public int TypeId { get; set; }
    public string TypeName { get; set; }
    public int StatusId { get; set; }
    public virtual Status Status { get; set; }

Status.cs

    [Key] 
    public int StatusId { get; set; }
    public string StatusName { get; set; }
    public List<Tip> Tips { get; set; }

广告.cs

    [Key]
    public int AdvId { get; set; }       
    public string Description { get; set; }
    public int StatusId { get; set; }
    public int TypeId { get; set; }
    [ForeignKey("TypeId")]
    public Tip Tip { get; set; }

家庭控制器

public PartialViewResult StatusName1()
{
    string statusname1 = _context.Tips.Where(i => i.StatusId == 1)
                                      .FirstOrDefault()
                                      .ToString();
    return PartialView(statusname1);
}

局部视图StatusName1:

@model RealEstateAspNetCore3._1.Models.Tip

 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button">
  @Model.Status.StatusName <span class="caret"></span> </a>

Index.cshtml 在索引中我列出了广告表并且效果很好,我使用了如下模型

@model IEnumerable<RealEstateAspNetCore3._1.Models.Advertisement>
  

在我像这样调用 RenderBoy 上面的部分后在布局中出现错误

 <partial name="StatusName1" />

我花了两天时间试图解决这个问题,但错误仍然存​​在。

谢谢

【问题讨论】:

  • 错误很明显你将错误的模型传递给partialview
  • 您收到此错误是因为类似string statusname1 = _context.Tips.Where(i =&gt; i.StatusId == 1).FirstOrDefault().ToString(); 您正在返回string,而您的viewModel 期待@model RealEstateAspNetCore3._1.Models.Tip
  • @MdFaridUddinKiron @Hossein 非常感谢您的反馈。我从string statusname1 = _context.Tips.Where(i =&gt; i.StatusId == 1).FirstOrDefault().ToString(); 编辑到var statusname1 = _context.Tips.Where(i =&gt; i.StatusId == 1).FirstOrDefault();Tip statusname1 = _context.Tips.Where(i =&gt; i.StatusId == 1).FirstOrDefault();,我得到同样的错误
  • 你想用这个string statusname1返回什么?只有StatusName?或者StatusName的列表?
  • 谢谢你们的反馈,它的工作原理正如 @Pritom Sarkar 兄弟所说,我必须使用组件视图而不是 partialResultView 方法

标签: c# asp.net-core razor


【解决方案1】:

如果您在需要引用视图的完整路径时从 _Layout.cshtml 调用局部视图:

<partial name="~/Views/Home/StatusName1.cshtml" />

将 Views/Home 替换为项目中的任何文件夹名称。在此处查看更多信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/partial?view=aspnetcore-5.0#partial-tag-helper

您提供的 sn-ps 中存在模型和许多其他问题 - 我认为 @pritom-sarkar 的答案已经解决了大部分问题

【讨论】:

  • 是的,@Pritom Sarkar 先生的回答是正确的,终于成功了,谢谢您的反馈
【解决方案2】:

我假设您的部分视图名称是StatusName1

如下更改您的代码:-

public IActionResult StatusName1()
{
    var status1 = _context.Tips.Where(i => i.StatusId == 1)
                                      .FirstOrDefault();

    return PartialView("StatusName1",status1);
}

它将解决您的问题。

更新

在 MVC 核心中你需要使用 ViewComponent 而不是局部视图。

创建一个名为Components 的文件夹,该类必须继承自 ViewComponent。我会给这个组件类名CategoryWiseMenu


namespace DigitalShop.Components
{
    public class CategoryWiseMenu:ViewComponent
    {
       private readonly ApplicationDbContext _db;

        public CategoryWiseMenu(ApplicationDbContext db)
        {
            _db = db;
        }

        public IViewComponentResult Invoke()
        {
            var c = _db.Tips.Where(i => i.StatusId == 1)
                                      .FirstOrDefault();
            return View("Default.cshtml",c);
        }
    }
}

~/Views/Shared/Components/Default.cshtml

在组件文件夹中创建Default.cshtml,如上路径。

演示Default.cshtml

<ul class="navbar-nav flex-grow-1">


    @foreach (var rr in Model)
    {
        <li class="nav-item text-dark">
            <a asp-controller="" asp-action=""
                class="nav-link text-dark">@rr.TypeName</a>
        </li>
    }
    
</ul>

现在在您的布局页面中包含以下代码。

@await Component.InvokeAsync("CategoryWiseMenu")

现在它可以正常工作了。

【讨论】:

  • @SabZero 我不清楚。我已经看到,在上面的评论中,你想要局部视图中的提示模型。我的意思是,您想在 (StatusName1) 部分视图中使用 Tip 模型属性吗?
  • @SabZero 现在很清楚了。你实际上不能在布局页面中使用部分视图,如.net MVC.in mvc core 你需要使用ViewComponent而不是部分视图。
  • @SabZero 我更新了我的答案。请检查。
  • @SabZero 我也在Default.cshtml获得了演示。
  • 非常感谢它的工作我期待 asp.net mvc 代码可以在核心中使用....终于它的工作:)
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 2017-09-26
  • 2021-07-31
  • 2022-06-27
  • 2021-12-24
  • 2022-01-19
  • 2018-12-25
相关资源
最近更新 更多