使用不同的控制器和模型MVC共享部分美景(MVC Shared Partial Views usin

2019-10-18 17:06发布

我有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);
        }

我的视图模型代码

    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.IQueryable 1 [MiLife2.ViewModels.MyViewModel]” 。

如果我在特定的控制器使用@ HTML.Partial(“_ ProjPartial”),从指数CSHTML页面内views文件夹不会出现这种情况。

Answer 1:

从错误看起来,我认为你的部分观点是寻找同型号你有你的看法。 通过该模型的部分应该修复错误

@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,在点击按钮或按需要刷新视图。 希望调用它这样将解决您的错误。 让我知道如果您有任何问题。



Answer 2:

最近遇到了类似的事情,所以我想补充我的2美分。 对我来说,答案是我经过的局部视图什么。

我试图将字符串传递到局部视图,但是当该字符串正好是null ,它充当如果我没有通过任何物体插入部分,这意味着它默认为传递当前视图模型。

例如,我有这使得一个局部和部分取入的字符串的视图:

@model SomeModel

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

如果SomeModel.StringProperty恰好是null ,那么它会尝试,并通过不断的当前视图的模式是什么(在这种情况下是SomeModel )。 所以不是,我只是写了将一个空字符串传递,如果以下SomeModel.StringProperty恰好是空:

@model SomeModel

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

希望这可以帮助别人。



文章来源: MVC Shared Partial Views using different controllers and models