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


Answers

유형이 일치하는 경우에도 부분 뷰에 null이 전달되면이 오류가 발생할 수 있습니다.

RenderPartial 과 같이 빈 ViewDataDictionary RenderPartial 을 호출하여이 문제를 해결할 수 있습니다.

helper.RenderPartial("~/Views/Player/PlayerName.ascx", player, new ViewDataDictionary());

참고로이 솔루션은 다음에서 찾았습니다.
null 모델이있는 renderpartial이 잘못된 유형으로 전달됩니다.

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.Web.Mvc.ViewPage 또는 System.Web.Mvc.ViewPage<T> 상속합니까? T는 귀하의 모델입니까?




동일한 이름의 여러 부분이있는 경우 (동일한 이름의 다른 부분을 대체하는 경우), 각보기에서 모델 유형을 갱신해야합니다. 그렇지 않으면이 오류가 발생할 수 있습니다.




ASP.NET MVC 부분

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

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



이 오류는 컨트롤러 조치 메소드가 뷰에 제공하는 데이터와 뷰가 예상하는 데이터 유형간에 불일치가있을 때 발생할 수 있습니다. 프리 컴파일 된 뷰를 사용하는 경우에도 일반적으로 빌드 오류로 표시되지 않습니다.

예를 들어, 제가 방법이 있다면 ...

public ActionResult Create()
{
    // Do something
    return View(new CustomerCreateViewModel());
}

... 및 페이지 속성이있는 만들기보기 ...

<%@ Page ... Inherits="System.Web.Mvc.ViewPage<CustomerDetailsViewModel>" %>

...이 컴파일 및 오류없이 빌드됩니다. 그러나 Create 액션을 호출하면 Create 액션 메서드가 한 유형의 데이터를 던지고 뷰에 다른 유형의 데이터가 필요하기 때문에 노란색 화면이 표시됩니다. 유형이 일치하는지 확인하고 싶을 수도 있습니다 ...




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

사전에 전달 된 모델 항목의 형식은 '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);