Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can a Razor view have more than one model without using a ViewModel object?

@model MyMVC.Models.MyMVC.MyModel

@{
    ViewBag.Title = "Index";
}

The reason why I ask this question is in MVC we can have more than 1 form, so I would like to have a model for each form. But when I was trying to add another model at the top of the view, it displays an error. I know we can use ViewModel which has model1 and model2 inside, but it's not the question I am asking.

I just simply want to know is there any way that we can put in 2 models into 1 view.

Update:

For example, I want to have 2 forms in my view, so for each form I'd like to have a separated model.

Update 2 Thank you all for your replies. I now know that MVC only supports one single model on one view. Do you guys consider this a disadvantage of MVC? Why or Why not?(No one has answered it yet.... why?)

Your answers are similar, so I don't even know which one should be set as an answer.

like image 692
Franva Avatar asked Jan 25 '13 05:01

Franva


Video Answer


3 Answers

You should use some prtialviews for other models. You have your main view with main model. Inside of that view, you could have some partialviews with their models and their validations.

--------------------------------------Edit:

As others said it is better to use View Models and combine the models with each others. But as you wanted I created a sample project for you on my Github account:

https://github.com/bahman616/ASPNET_MVC_multiple_models_in_a_view_with_partialview.git

Here is the simplified code of that project:

Here are two models:

public partial class Person
{
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
}
public partial class Company
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
}

I want to have both create views in one view, so this is the parent view:

@model ASP_NET_MVC_Multiple_Models_In_A_View.Models.Person

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm("Create","Person")) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Person</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

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

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@{Html.RenderAction("_CompanyCreate", "Company");}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

And this is the partial view:

@model ASP_NET_MVC_Multiple_Models_In_A_View.Models.Company

<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

@using (Html.BeginForm("_CompanyCreate","Company")) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Company</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

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

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
like image 196
Bahman Avatar answered Oct 13 '22 20:10

Bahman


Simple answer: No, you can't have two models.

Details There is only one way to declare a Model to be used by a view:

@model [namespace].[path].[ViewModelName]

There is no way to specify multiple of these above.

In addition to that, you can only send one object to a view from the Controller, which would be the model:

public ActionResult WhateverAction()
{
    var model = new MyViewModel();
    return View(model);
}
like image 36
Dmitry Efimenko Avatar answered Oct 13 '22 20:10

Dmitry Efimenko


Theoretically you cant do it because it binds one model to one view. But you can create somethink like a model helper which combines two other models to one

public class model1
{
     string var1 {get; set;}
     string var2 {get; set;}
}

public class model2
{
     string var3 {get; set;}
     string var4 {get; set;}
}

public class modelofBoth
{
     model1 mod1 {get; set;}
     model2 mod2 {get; set;}
}
like image 43
COLD TOLD Avatar answered Oct 13 '22 19:10

COLD TOLD