[c#] 사전에 전달 된 모델 항목은 'mvc.Models.ModelA'유형이지만이 사전에는 'mvc.Models.ModelB'유형의 모델 항목이 필요합니다.



3 Answers

ASP.NET MVC 부분

NULL 모델이 통과되었습니다!

@Html.Partial("PartialView", model: Model)
Question

내 빌드 중 일부에서이 성가신 실수가 있습니다.

다시 빌드하면 문제가 사라지기 때문에 프로젝트에 오류가 없습니다. 사이트가 Windows 2008 Server에 배포 된 경우에만 메시지가 나타납니다.

처음에는 임시 파일에 문제가있을 수 있다고 생각했지만 사실이 아닙니다. 빌드를 다른 웹에 배포했는데 오류가 계속 나타납니다.

사이트의 임의의 작업에 오류가 나타납니다. 대부분의 빌드는 괜찮지 만 3 번째 또는 4 번째 빌드마다 런타임 오류가 발생합니다.

릴리스 모드에서 WebdeploymentProject를 사용하여 빌드합니다. 뷰는 미리 컴파일됩니다.

ASP.NET MVC에서 보기가 완전히 다른 이름을 가지고 있기 때문에 올바른 형식이 지정된 객체로 페이지를 렌더링 할 때 잘못된 유형 오류가 발생 합니다.

이 문제를 어떻게 디버깅 할 수 있습니까? 또는이 문제를 어떻게 해결할 수 있습니까?

다음은 내 웹 배포 프로젝트입니다.

    <!-- 
      Microsoft Visual Studio 2008 Web Deployment Project 
      http://go.microsoft.com/fwlink/?LinkID=104956

    -->
    <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <ProductVersion>9.0.21022</ProductVersion>
        <SchemaVersion>2.0</SchemaVersion>
        <ProjectGuid>{E5E14CEB-0BCD-4203-9A5A-34ABA9C717EA}</ProjectGuid>
        <SourceWebPhysicalPath>..\B2CWeb</SourceWebPhysicalPath>
        <SourceWebProject>{3E632DB6-6DB3-4BD0-8CCA-12DE67165B48}|B2CWeb\B2CWeb.csproj</SourceWebProject>
        <SourceWebVirtualPath>/B2CWeb.csproj</SourceWebVirtualPath>
        <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <DebugSymbols>true</DebugSymbols>
        <OutputPath>.\Debug</OutputPath>
        <EnableUpdateable>false</EnableUpdateable>
        <UseMerge>true</UseMerge>
        <SingleAssemblyName>B2CWeb_Build</SingleAssemblyName>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
        <DebugSymbols>false</DebugSymbols>
        <OutputPath>..\B2CWeb_Deploy\</OutputPath>
        <EnableUpdateable>false</EnableUpdateable>
        <UseMerge>true</UseMerge>
        <SingleAssemblyName>B2C_Web</SingleAssemblyName>
        <ContentAssemblyName>
        </ContentAssemblyName>
        <DeleteAppCodeCompiledFiles>false</DeleteAppCodeCompiledFiles>
      </PropertyGroup>
      <ItemGroup>
      </ItemGroup>
      <Import Project="$(MSBuildExtensionsPath)\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets" />
      <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
           Other similar extension points exist, see Microsoft.WebDeployment.targets.
      <Target Name="BeforeBuild">
      </Target>
      <Target Name="BeforeMerge">
      </Target>
      <Target Name="AfterMerge">
      </Target>
      <Target Name="AfterBuild">
      </Target>
      -->
    </Project>

편집하다

몇 달 후이 문제는 사라졌습니다. 나는 1 년 넘게 문제가 없었다. 아무도 예상하지 못하면 문제가 다시 발생한다고 생각합니다.

2 번 수정

... 2 년 넘게. 나는 그런 행운아 야!

3 수정

방금 MSDN 에서 기사를 읽었습니다. 문제가있는 것 같습니다. 나는 디버깅을 사용할 수 없지만 컴파일은 여전히 ​​"때로는 잘못"되었습니다. 오래된 제공자의 행동이 문제가 될 수 있습니다. 그러나 이것은 단지 추측 일뿐입니다.

서버 블록이없는 HTML의 긴 스팬 (예 : <% = %>)이 포함 된 매우 큰 페이지는 응용 프로그램을 중단시킬 수있는 디버그 컴파일이 활성화 될 때 스택 오버플로를 유발할 수 있습니다. 우리의 테스트에서 이전 공급자에서 비슷한 문제를 일으킨 4x 크기의 페이지를 가져 왔지만이 경우 전체 응용 프로그램이 충돌하는 반면 이전 공급자의 경우 문제가있는 페이지가 실패합니다




이것이 뷰에 전달되는 데이터와 아무런 관련이 없다는 것을 절대 확신합니까? 매번 전체 재구성을 수행하고 있습니까?

이러한 오류는 일반적으로 부분 뷰로 전달 된 뷰 모델이 null 일 때 부분 뷰가 ViewPage로 전달 된 뷰 모델을 사용하려고하기 때문에 발생합니다. 오류가 어떻게 든 빌드 프로세스로 인해 발생했다는 것을 암시하고 있음을 알게되었지만 어떻게 가능할지를 알지 못합니다. 배포 된 사이트가 개발 컴퓨터에서 실행하는 사이트와 다른 데이터베이스를 사용하고 해당 데이터베이스의 데이터 (또는 데이터 부족)가 문제의 원인이 될 수 있습니까?




다음과 같은 오류 메시지가 나타났습니다.

사전에 전달 된 모델 항목의 형식은 'System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A, MyProject.Models.B]'이지만이 사전에는 'System.Collections.Generic.List1'유형의 모델 항목이 필요합니다. [MyProject.Models.B] '.

다음 코드로

IEnumerable<B> list_B;
...
IEnumerable<A> list_A = Repo.GetListOfType_A();
list_B = list_A.Select(x => new B { Number = x.Number, Name = x.Name });
...
return View(list_B);

그리고 나는 그 타입이 무엇인지 전혀 모른다.

System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A, MyProject.Models.B]

어쨌든, .ToList() 를 끝에 추가하면 오류가 사라집니다.

IEnumerable<B> list_B;
...
IEnumerable<A>list_A = Repo.GetListOfType_A();
list_B = list_A.Select(x => new B { Number = x.Number, Name = x.Name }).ToList(); // here
...
return View(list_B);

다른 사람을 도울 수 있기를 바랍니다.




보기에서 모델을 usercontrol에 할당하기 전에 모델 / 개체의 생성자에서 특정 개체를 인스턴스화하십시오.

예:

 public class MainEntity
 {
    public SubEntity AssociatedEntity;

    public MainEntity()
    {
        // This is where the instantiation happen.
        AssociatedEntity = new SubEntity(); 
    }
 }

 public class SubEntity
 {
    public string property1;
 }

귀하의보기 페이지 :

<%@ Page Title="" Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<MyNamespace.Models.MainEntity>" %>
....
<%Html.RenderPartial("ucMyUserControl",Model.AssociatedEntity);
....

사용자 정의 컨트롤 :

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<MyNamespace.Models.SubEntity>" %>
....
<%Html.TextBoxFor(m=>m.Property1);


Related