开发者

Problem with error about model being passed into partial view

开发者 https://www.devze.com 2023-02-19 08:52 出处:网络
So I am trying to render a partial view into my page and I am getting the below error: ERROR The model item passed into the dictionary is of type

So I am trying to render a partial view into my page and I am getting the below error:

ERROR

The model item passed into the dictionary is of type 
'System.Collections.Generic.List`1[GettingOrganized.Models.Todo]', but this 
dictionary requires a model item of type 'GettingOrganized.Models.Todo'.

I don't see what is wrong with the partial view or controller.

PARTIAL VIEW

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<GettingOrganized.Models.Todo>" %> 
<% using (Html.BeginForm("Create", "Todo", FormMethod.Post, new {id="CreateTodo"})) {%>

    <fieldset>
        <legend>Fields</legend>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Title) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Title) %>
            <%= Html.ValidationMessageFor(model => model.Title) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

Controller Index View that Renders the Partial View:

<% Html.RenderPartial("CreateElements"); %> 

Any thoughts? I would like to keep it as close to this setup since is strong typed.

UPDATE

So to provide a few more details, now that problem is becoming more clear. I am rendering the view on the page in a div and hiding it the user clicks a certain link. Then I want to show the div. This same partial is used in a "Create" view where you can create a "Todo". But I am now wanting to use the partial in the Index view which shows a list of the model "Todo".

The model passed in, in the "Index" view:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<GettingOrganized.Models.Todo>>" %>

So if I don't want to loop through a foreach loop, and just want to show one instance of the model, who do I do that?

Also I can us开发者_JAVA技巧e the following view for the partial and it will work which takes away the strongly typed to the model:

WORKING PARTIAL

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<% using (Html.BeginForm("Create", "Todo", 
FormMethod.Post, new { id="CreateTodo"})) {%>
<fieldset>
    <legend>Fields</legend>
    <p>
        <label for="Title">Title:</label>
        <%=Html.TextBox("Title")%>
        <%=Html.ValidationMessage("Title", "*")%>
    </p>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
<p>
<input type="submit" value="Create" />
</p>
<% } %>

Possible Answer

However, I believe I might have found an answer.

<% Html.RenderPartial("CreateElements", new Todo()); %>

Is this a proper way to handle this?


However, I believe I might have found an answer.

<% Html.RenderPartial("CreateElements", new Todo()); %>


It looks like you need to pass the model to the partial view - as in:

 <% Html.RenderPartial("CreateElements", myModel); %> 


I would look into how you're passing in your model into the RenderPartial:

<% Html.RenderPartial("CreateElements", model); %>

And make sure that model is of type GettingOrganized.Models.Todo.


Since you're not passing a model into your RenderPartial call, MVC is effectively trying to create one for you using the ViewDataDictionary and model from the parent page.

It looks like the parent page has a model type which is a List of ToDo items, so I guess you can just call your RenderPartial method inside of a loop; something along the lines of:

<% foreach (GettingOrganized.Models.Todo todoItem in Model) {
    Html.RenderPartial("CreateElements", todoItem);
} %>
0

精彩评论

暂无评论...
验证码 换一张
取 消