views:

58

answers:

2

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.

+1  A: 

Couldn't you simply keep all your views strongly typed by letting both the model types that you want to render in your AddressForm view implement an interface, and let the AddressForm partial use that interface as its model type?

Jonas H
<-- New to MVC and .net. I'll search around here for an example of that. Thank you!
Andy Poquette
+1 exactly how i'd do it. i.e. <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IAddress>" %>.. or similar where IAddress is an interface that any of your address model classes inherit from.
jim
+2  A: 

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>
Omu
THANK YOU! That worked perfectly.
Andy Poquette
your welcome :-)
Omu