Две модели в одном представлении в ASP MVC 3

У меня есть 2 модели:

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

Я хочу редактировать объекты ОБА классов в ОДНОМ представлении, поэтому мне нужно что-то вроде:

@model _try2models.Models.Person
@model _try2models.Models.Order

@using(Html.BeginForm())
{
    @Html.EditorFor(x => x.PersonID)
    @Html.EditorFor(x => x.PersonName)
    @Html.EditorFor(x=>x.OrderID)
    @Html.EditorFor(x => x.TotalSum)
}

Это, конечно, не работает: в файле .cshtml разрешен только один оператор 'model'. Может быть, есть какое-то решение?

89 голосов | спросил Smarty 5 PMpTue, 05 Apr 2011 14:49:22 +040049Tuesday 2011, 14:49:22

10 ответов


0

Создайте модель родительского представления, которая содержит обе модели.

public class MainPageModel{
    public Model1 Model1{get; set;}
    public Model2 Model2{get; set;}
}

Таким образом, вы можете добавить дополнительные модели позже с минимальными усилиями.

ответил Andrew 5 PMpTue, 05 Apr 2011 14:51:28 +040051Tuesday 2011, 14:51:28
0

Чтобы использовать кортеж, необходимо сделать следующее, в представлении измените модель на:

@model Tuple<Person,Order>

чтобы использовать методы @html, вам необходимо выполнить следующие действия:

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

или

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

Item1 указывает первый параметр, переданный методу Tupel, и вы можете использовать Item2 для доступа ко второй модели и т. д.

в вашем контроллере вам нужно создать переменную типа Tuple и затем передать ее в представление:

    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);
    }

Другой пример: Несколько моделей в виде

ответил Hamid 11 TueEurope/Moscow2012-12-11T08:07:53+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 08:07:53 +0400 2012, 08:07:53
0

Если вы любите иметь очень плоские модели, просто для поддержки вида вы должны создать модель, специфичную для этого конкретного вида ...

public class EditViewModel
    public int PersonID { get; set; }
    public string PersonName { get; set; }
    public int OrderID { get; set; }
    public int TotalSum { get; set; }
}

Многие люди используют AutoMapper для сопоставления своих доменных объектов с плоскими представлениями.

Идея модели представления заключается в том, что она просто поддерживает представление - и ничего больше. У вас есть один для каждого представления, чтобы убедиться, что он содержит только то, что требуется для этого представления, а не множество свойств, которые вы хотите для других представлений.

ответил Fenton 5 PMpTue, 05 Apr 2011 14:59:29 +040059Tuesday 2011, 14:59:29
0

На самом деле есть способ использовать две или более модели в одном представлении, не заключая их в класс, который содержит обе.

Использование Employee в качестве примера модели:

@model Employee

На самом деле рассматривается как.

@{ var Model = ViewBag.model as Employee; }

Таким образом, метод View (employee) устанавливает вашу модель на ViewBag, а затем ViewEngine приводит ее.

Это означает, что

ViewBag.departments = GetListOfDepartments();
    return View(employee);

Может использоваться как,

            @model  Employee
        @{
                var DepartmentModel = ViewBag.departments as List<Department>;
        }

По сути, вы можете использовать все, что есть в вашем ViewBag, в качестве «Модели», потому что так оно и работает. Я не говорю, что это архитектурно идеально, но это возможно.

ответил Alex Tselevich 9 J0000006Europe/Moscow 2015, 17:18:43
0

хорошо, все имеют смысл, и я взял все кусочки и положил их сюда, чтобы помочь таким новичкам, как я, которые должны начать заканчивать объяснение.

Вы делаете свой большой класс, который содержит 2 класса, согласно ответу @ Эндрю.

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

Затем в вашем контроллере вы заполняете 2 модели. Иногда вам нужно заполнить только один. Затем в ответе вы ссылаетесь на большую модель, и она переводит 2 с собой в представление.

            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);

В верхней части вида

@model yourNamespace.Models.teamBoards

Затем загрузите свои входные данные или дисплеи, ссылающиеся на большое содержание моделей:

 @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" })

А. , , Обратно на ранчо, когда придет Почта, сослаться на Большой Класс:

 public ActionResult ContactNewspaper(teamBoards teamboards)

и использовать то, что вернули модели:

string yourVariable = teamboards.Team.yourField;

Возможно, в классе есть что-то от DataAnnotation Validation и, возможно, поместите if (ModelState.IsValid) в верхней части блока сохранения /редактирования. , ,

ответил JustJohn 20 AMpWed, 20 Apr 2016 04:32:13 +030032Wednesday 2016, 04:32:13
0

Просто создайте одну модель представления со всей необходимой информацией, обычно я создаю модель для каждого представления, чтобы я мог быть конкретным для каждого представления, будь то или создать родительскую модель и наследовать ее. ИЛИ сделайте модель, которая включает в себя оба вида.

Лично я бы просто добавил их в одну модель, но так я и сделаю:

public class xViewModel
{
    public int PersonID { get; set; }
    public string PersonName { get; set; }
    public int OrderID { get; set; }
    public int TotalSum { get; set; }
}

@model project.Models.Home.xViewModel

@using(Html.BeginForm())
{
    @Html.EditorFor(x => x.PersonID)
    @Html.EditorFor(x => x.PersonName)
    @Html.EditorFor(x => x.OrderID)
    @Html.EditorFor(x => x.TotalSum)
}
ответил Michael 12 PM00000020000000731 2014, 14:28:07
0

Вы можете использовать шаблон презентации http://martinfowler.com/eaaDev/PresentationModel.html

Эта модель представления "Представление" может содержать как персона, так и порядок, этот новый
Класс может быть моделью вашего представления ссылок.

ответил James Kyburz 5 PMpTue, 05 Apr 2011 14:53:17 +040053Tuesday 2011, 14:53:17
0

Еще один способ, о котором никогда не говорят, Создайте представление в MSSQL со всеми данными, которые вы хотите представить. Затем используйте LINQ to SQL или что-то еще, чтобы отобразить его. В вашем контроллере верните его в вид. Готово.

ответил hidden 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2011 01:16:47 +0400 2011, 01:16:47
0

вы не можете объявить две модели в одном представлении, попробуйте использовать Html.Action("Person", "[YourController]") & Html.Action("Order", "[YourController]")

Удачи.

ответил Jimmy Mac 13 AM000000110000002931 2013, 11:20:29
0

Надеюсь, вы найдете это полезным !!

я использую ViewBag для проекта и модель для задачи, поэтому я использую две модели в одном представлении и в контроллере я определил значение или данные viewbag

 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
            });

и с точки зрения tbltask и projectlist мои две модели различий

@ {

IEnumerable<SelectListItem> plist = ViewBag.projectList;

} @model List

ответил Muhafil Saiyed 4 PMpMon, 04 Apr 2016 13:11:04 +030011Monday 2016, 13:11:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132