views:

585

answers:

5

I have this annoying mistake in some of my builds.

There is no error in the project, because if I build again, then the problem disappears. The message only appears, when the site is deployed to a Windows 2008 Server.

I first thought that it might be an issue with temporary files, but thats not the case. I deployed the build to a different web and the error still appears.

The error appears on random actions of the site. Most of the time builds are ok, but each 3rd or 4th build produces runtime errors.

I build using a WebdeploymentProject in release mode. Views are precompiled.

It's not http://stackoverflow.com/questions/178194/in-asp-net-mvc-i-encounter-an-incorrect-type-error-when-rendering-a-page-with-the, because views have totally different names.

How I can debug this problem or how I can get help for this?

Here is my WebDeploymentProject

    <!-- 
      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"&gt;
      <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>
A: 

Do the build trigger any warnings or errors at all?

Do you have your dependencies set up correctly? Eg. views depending on models. Build figures out in what order to compile things by looking at the dependencies specified. Eg. if you change a model and the view is compiled before the model you get into trouble...

Do this disappear if you don't compile views?

Also do your views inherit System.Web.Mvc.ViewPage or System.Web.Mvc.ViewPage<T> where T is your model?

svinto
Do this disappear if you don't compile views?Thats something I will try...Good idea!
Malcolm Frexner
A: 

Are you absolutely sure that this has nothing to do with the data being passed to the view? Are you performing a full rebuild each time?

These errors typically occur because a partial view tries to use the view model passed to the ViewPage when the view model passed to the partial view is null. I realize that you are implying that the error is somehow caused by the build process, but I don't see how that would be possible. Could it be that the deployed site uses a different database than the site you run on your development machine, and could the data (or lack of data) in that database be the cause of the problem?

Rune
Its realy the build. If I rebuild and leave everything as it is, then the error desapears...or appears on a different action
Malcolm Frexner
+1  A: 

This error can occur (and does) when there is a mismatch between the data that the controller action method is supplying to the view and the type of data the view is expecting. This will not normally show up as a build error, even with precompiled views.

For example, if I have a method...

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

...and a Create view with a Page attribute...

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

...this will compile and build without error. However, when I call the Create action, I'm going to get a yellow screen, because the Create action method is throwing data of one type and the view is expecting data of a different type. You might want to verify that your types are matching...

Neil T.
Your explanantion is definitily right. But my problem is that some build are ok and others not, even with the same source.
Malcolm Frexner
+2  A: 

Even if the types match, you can get this error when a null is passed to a partial view, the fix was to call RenderPartial like this: helper.RenderPartial("~/Views/Player/PlayerName.ascx", player,new ViewDataDictionary()); with an empty view data dictionary, perhaps that applies here as well? For reference I found this solution at:

http://stackoverflow.com/questions/650393/asp-net-mvc-renderpartial-with-null-model-gets-passed-the-wrong-type

Maslow
If I have a build that is not ok, then any data passed to the View results in the error.
Malcolm Frexner
"You can get this error when a null is passed to a partial view" -- bingo, fixed it for me. Thanks!
Nicholas Piasecki
A: 
Hi, before assigning the model to the usercontrol from your view, instantiate that particular object in the constructor of the Model/Entity.

Ex:


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

Your View Page :

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

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