У меня 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 допускается только одно «модельное» выражение. Может быть есть обходной путь?
asp.net-mvc-3
viewmodel
Умный
источник
источник
ViewBag
чтобы каждый вид работал у меня, проверьте это, чтобы узнать несколько вариантов, сэкономил немного времени для меня вместо создания модели представления или частичного представленияОтветы:
Создайте родительскую модель представления, содержащую обе модели.
public class MainPageModel{ public Model1 Model1{get; set;} public Model2 Model2{get; set;} }
Таким образом, вы можете добавить дополнительные модели позже с минимальными усилиями.
источник
Чтобы использовать кортеж, вам необходимо сделать следующее, в представлении измените модель на:
чтобы использовать методы @html, вам необходимо сделать следующее, например:
или
@Html.ActionLink("Edit", "Edit", new { id=Model.Item1.Id }) |
Item1 указывает первый параметр, переданный в метод Tuple, и вы можете использовать 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); }
Другой пример: несколько моделей на виде
источник
Tuple
в этом случае - OP хочет редактировать данные, а aTuple
не имеет конструктора по умолчанию, поэтому модель не может быть привязана приДругой вариант, при котором нет необходимости создавать настраиваемую модель, - это использовать Tuple <> .
Это не так чисто, как создание нового класса, который содержит оба, согласно ответу Анди, но это жизнеспособно.
источник
@model
строк?@Model.Item1.Property
и@Model.Item2.Property
дляPerson
иOrder
соответственноЕсли вы поклонник очень плоских моделей, просто для поддержки вида вам следует создать модель, специфичную для этого конкретного вида ...
public class EditViewModel public int PersonID { get; set; } public string PersonName { get; set; } public int OrderID { get; set; } public int TotalSum { get; set; } }
Многие люди используют AutoMapper для отображения объектов своей области на плоские представления.
Идея модели представления состоит в том, что она просто поддерживает представление - ничего больше. У вас есть по одному на представление, чтобы гарантировать, что оно содержит только то, что требуется для этого представления, а не множество свойств, которые вы хотите для других представлений.
источник
хорошо, все имеют смысл, и я взял все части и положил их сюда, чтобы помочь новичкам, таким как я, которым нужно начало и конец объяснения.
Вы делаете свой большой класс, содержащий 2 класса, согласно ответу @ Andrew.
public class teamBoards{ public Boards Boards{get; set;} public Team Team{get; set;} }
Затем в вашем контроллере заливаете 2 модели. Иногда нужно заполнить только одну. Затем, в ответ, вы ссылаетесь на большую модель, и она возьмет 2 внутри с собой в 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);
Вверху просмотра
Затем загрузите свои входы или дисплеи, ссылающиеся на большое содержимое моделей:
@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 и, возможно, поместите if (ModelState.IsValid) в верхнюю часть блока сохранения / редактирования. . .
источник
Фактически, есть способ использовать две или более моделей в одном представлении, не помещая их в класс, содержащий обе.
Использование Employee в качестве примера модели:
Собственно обращаются как.
@{ var Model = ViewBag.model as Employee; }
Таким образом, метод View (сотрудник) устанавливает вашу модель в ViewBag, а затем ViewEngine выполняет ее преобразование.
Это значит, что,
ViewBag.departments = GetListOfDepartments(); return View(employee);
Может использоваться как,
@model Employee @{ var DepartmentModel = ViewBag.departments as List<Department>; }
По сути, вы можете использовать все, что находится в вашем ViewBag, в качестве «модели», потому что так оно и есть в любом случае. Я не говорю, что это архитектурно идеально, но это возможно.
источник
Просто создайте единую модель представления со всей необходимой информацией в ней, обычно я создаю модель для каждого представления, чтобы я мог быть конкретным для каждого представления, либо это, либо создать родительскую модель и наследовать ее. ИЛИ создайте модель, включающую оба вида.
Лично я бы просто добавил их в одну модель, но я это делаю так:
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) }
источник
Вы можете использовать шаблон презентации http://martinfowler.com/eaaDev/PresentationModel.html
Эта модель представления "View" может содержать как Person, так и Order, этот новый
класс может быть моделью, на которую ссылается ваше представление.
источник
Другой способ, о котором никогда не говорят, - это создать представление в MSSQL со всеми данными, которые вы хотите представить. Затем используйте LINQ to SQL или что-то еще, чтобы сопоставить его. В вашем контроллере верните его в представление. Выполнено.
источник
вы не можете объявить две модели в одном представлении, попробуйте использовать
Html.Action("Person", "[YourController]")
&Html.Action("Order", "[YourController]")
.Удачи.
источник
Помимо одной модели представления в asp.net вы также можете создать несколько частичных представлений и назначить разные представления модели каждому представлению, например:
@{ Layout = null; } @model Person; <input type="text" asp-for="PersonID" /> <input type="text" asp-for="PersonName" />
затем еще одна модель частичного представления для модели заказа
@{ Layout = null; } @model Order; <input type="text" asp-for="OrderID" /> <input type="text" asp-for="TotalSum" />
затем в главном представлении загрузите оба частичных представления
<partial name="PersonPartialView" /> <partial name="OrderPartialView" />
источник
Я надеюсь, вы найдете это полезным !!
Я использую 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 - мои две модели различий
@ {
} @model List
источник