1

我有 2 个控制器生成 2 个索引视图。我想做的是将这些视图用作全局共享部分视图,但似乎无法使其正常工作。

有谁知道这是否可能?

我的控制器代码是

  public ActionResult Index()
        {

            var viewModel = (from P in db.Projects
                             join R in db.Reports on P.ProjectTitle equals R.ReportProjectID into ps
                             from R in ps.DefaultIfEmpty()
                             select new MyViewModel { Project = P, Report = R });


            return View(viewModel);
        }

我的 ViewModel 代码是

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace MiLife2.ViewModels
    {
    public class MyViewModel
    {
        public Project Project { get; set; }
        public Report Report { get; set; }
    }
    }

我的观点是

    @model IQueryable<MiLife2.ViewModels.MyViewModel>

    @{
    ViewBag.Title = "Index";
    }
    enter code here

<h2>Index</h2>
<div>@Html.Partial("_Partial1")</div>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th></th>
    </tr>

@foreach (var item in Model)
{
    <tr>
        <td>@item.Project.ProjectTitle </td>
        <td>@item.Project.ProjectCreatedByID</td>
        <td>@item.Project.ProjectCreatedDate</td>


        <td>@if (item.Report == null)
            {
                <text>No Reports</text>
            }
            else
            {
               @item.Report.Title;
            }
        </td>
        <td>@if (item.Report == null)
            {
                <text> </text>
            }
            else
            {
               @item.Report.Description;
            }</td>

        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Project.ProjectID }) |
            @Html.ActionLink("Details", "Details", new {  id=item.Project.ProjectID }) |
            @Html.ActionLink("Delete", "Delete", new {  id=item.Project.ProjectID })
        </td>
    </tr>
}

</table>

如果我创建一个部分页面并将上面的视图粘贴到其中,然后使用 @HTML.Partial("_ProjPartial") 我得到错误

传入字典的模型项的类型为“System.Collections.Generic.List 1[MiLife2.Project]', but this dictionary requires a model item of type 'System.Linq.IQueryable1[MiLife2.ViewModels.MyViewModel]”。

如果我在特定控制器视图文件夹的索引 cshtml 页面中使用 @HTML.Partial("_ProjPartial") ,则不会发生这种情况。

4

2 回答 2

3

从错误看来,您的局部视图正在寻找与您的视图相同的模型。将模型传递给您的部分应该可以解决该错误

@Html.Partial("_Partial1", Model)

更新:

因为那对你不起作用,我会尝试使用 ajax 调用

$('.btnSubmit').on('click', function(){
    $.ajax({
         url: "@(Url.Action("Action", "Controller"))",
         type: "POST",
         cache: false,
         async: true,
         data: { id: id },
         success: function (result) {
             $(".Content").html(result);
         }
    });

 });

然后在你的控制器中

public PartialViewResult GetPartial()
    {

        var viewModel = (from P in db.Projects
                         join R in db.Reports on P.ProjectTitle equals R.ReportProjectID into ps
                         from R in ps.DefaultIfEmpty()
                         select new MyViewModel { Project = P, Report = R });


        return PartialView("_Partial1", viewModel);
    }

使用此 ajax 调用,您可以从任何视图调用局部视图,并且您可以传递不同的 id,在按钮单击时或根据需要刷新视图。希望以这种方式调用它可以解决您的错误。如果您有任何问题,请告诉我。

于 2013-09-25T14:18:40.087 回答
3

最近遇到了类似的事情,所以我想加我的 2 美分。对我来说,答案就在我传递给局部视图的内容中。

我试图将字符串传递给局部视图,但是当该字符串恰好是 时null,它就好像我没有将任何东西传递给局部视图,这意味着它默认传递当前视图的模型。

例如,我有一个呈现部分的视图,并且该部分接受一个字符串:

@model SomeModel

@{ Html.RenderPartial("_MyPartialView", SomeModel.StringProperty) }

如果SomeModel.StringProperty碰巧是null,那么它将尝试传递当前视图的模型(在本例中是SomeModel)。因此,我只是简单地编写了以下内容,如果SomeModel.StringProperty碰巧为空,它将传入一个空字符串:

@model SomeModel

@{ Html.RenderPartial("_MyPartialView", SomeModel.StringProperty ?? string.Empty) }

希望这可以帮助某人。

于 2015-11-16T17:15:28.160 回答