Search code examples
asp.net-mvcviewpartial-viewsstrongly-typed-view

Rendering one partial view in two different strongly typed views


I have a strongly typed Person view, that I want to render a partial in:

Person View (strongly typed as person)

<label for="name">Name</label>
    <% Html.RenderPartial("AddressForm"); %>
</label>

AddressForm View (untyped, because I also want to use this in the Distributor strongly typed view)

When I try to call this partial from the Person view, I get this error:

Compiler Error Message: CS1963: An expression tree may not contain a dynamic operation

Source Error:

Line 8:    </div>  
Line 9:    <div class="editor-field">  
Line 10:       <%= Html.TextBoxFor(model => model.addressLine1) %>  
Line 11:       <%: Html.ValidationMessageFor(model => model.addressLine1) %>  
Line 12:   </div> 

How can I get this partial to render so that I can use my partial addressView across multiple other types?

Edited:

// GET: /Person/Create  

public ActionResult Create()  
{
    Person person = new Person();       
    return View(person);  
}  

//Person create view  
<% Html.RenderPartial("AddressForm"); %>

//AddressForm Partial
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>

<fieldset>  
    <legend>Address</legend>   
    <div class="editor-label">  
        <label for="addressLine1" class="addressLabel">Address Line 1</label>  
    </div>  
    <div class="editor-field">  
        <%= Html.TextBoxFor(model => model.addressLine1) %>  
        <%: Html.ValidationMessageFor(model => model.addressLine1) %>
    </div>
</fieldset>

Error is above.


Solution

  • you can't use strongly typed helpers with dynamic viewmodel:

    you can use non strongly typed helpers instead, like this:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    
    <fieldset>
    <legend>Address</legend>
    <div class="editor-label">
    <label for="addressLine1" class="addressLabel">
    Address Line 1</label>
    </div>
    <div class="editor-field">
    <%= Html.TextBox("addressLine1") %>
    <%: Html.ValidationMessage("addressLine1") %> </div>
    </fieldset>