Two models in one view in ASP MVC 3

后端 未结 12 1896
日久生厌
日久生厌 2020-11-22 13:55

I have 2 models:

public class Person
{
    public int PersonID { get; set; }
    public string PersonName { get; set; }
}
public class Order
{
    public int         


        
相关标签:
12条回答
  • 2020-11-22 14:52

    I hope you find it helpfull !!

    i use ViewBag For Project and Model for task so in this way i am using two model in single view and in controller i defined viewbag's value or data

    List<tblproject> Plist = new List<tblproject>();
                Plist = ps.getmanagerproject(c, id);
    
                ViewBag.projectList = Plist.Select(x => new SelectListItem
                {
                    Value = x.ProjectId.ToString(),
                    Text = x.Title
                });

    and in view tbltask and projectlist are my two diff models

    @{

    IEnumerable<SelectListItem> plist = ViewBag.projectList;
    

    } @model List

    0 讨论(0)
  • 2020-11-22 14:54

    Another option which doesn't have the need to create a custom Model is to use a Tuple<>.

    @model Tuple<Person,Order>
    

    It's not as clean as creating a new class which contains both, as per Andi's answer, but it is viable.

    0 讨论(0)
  • 2020-11-22 14:54

    ok, everyone is making sense and I took all the pieces and put them here to help newbies like myself that need beginning to end explanation.

    You make your big class that holds 2 classes, as per @Andrew's answer.

    public class teamBoards{
        public Boards Boards{get; set;}
        public Team Team{get; set;}
    }
    

    Then in your controller you fill the 2 models. Sometimes you only need to fill one. Then in the return, you reference the big model and it will take the 2 inside with it to the View.

                TeamBoards teamBoards = new TeamBoards();
    
    
            teamBoards.Boards = (from b in db.Boards
                                   where b.TeamId == id
                                   select b).ToList();
            teamBoards.Team = (from t in db.Teams
                                  where t.TeamId == id
                              select t).FirstOrDefault();
    
     return View(teamBoards);
    

    At the top of the View

    @model yourNamespace.Models.teamBoards
    

    Then load your inputs or displays referencing the big Models contents:

     @Html.EditorFor(m => Model.Board.yourField)
     @Html.ValidationMessageFor(m => Model.Board.yourField, "", new { @class = "text-danger-yellow" })
    
     @Html.EditorFor(m => Model.Team.yourField)
     @Html.ValidationMessageFor(m => Model.Team.yourField, "", new { @class = "text-danger-yellow" })
    

    And. . . .back at the ranch, when the Post comes in, reference the Big Class:

     public ActionResult ContactNewspaper(teamBoards teamboards)
    

    and make use of what the model(s) returned:

    string yourVariable = teamboards.Team.yourField;
    

    Probably have some DataAnnotation Validation stuff in the class and probably put if(ModelState.IsValid) at the top of the save/edit block. . .

    0 讨论(0)
  • 2020-11-22 14:54

    Another way that is never talked about is Create a view in MSSQL with all the data you want to present. Then use LINQ to SQL or whatever to map it. In your controller return it to the view. Done.

    0 讨论(0)
  • 2020-11-22 14:54

    you can't declare two model on one view, try to use Html.Action("Person", "[YourController]") & Html.Action("Order", "[YourController]").

    Good luck.

    0 讨论(0)
  • 2020-11-22 14:58

    To use the tuple you need to do the following, in the view change the model to:

    @model Tuple<Person,Order>
    

    to use @html methods you need to do the following i.e:

    @Html.DisplayNameFor(tuple => tuple.Item1.PersonId)
    

    or

    @Html.ActionLink("Edit", "Edit", new { id=Model.Item1.Id }) |
    

    Item1 indicates the first parameter passed to the Tuple method and you can use Item2 to access the second model and so on.

    in your controller you need to create a variable of type Tuple and then pass it to the view:

        public ActionResult Details(int id = 0)
        {
            Person person = db.Persons.Find(id);
            if (person == null)
            {
                return HttpNotFound();
            }
            var tuple = new Tuple<Person, Order>(person,new Order());
    
            return View(tuple);
        }
    

    Another example : Multiple models in a view

    0 讨论(0)
提交回复
热议问题