Две модели в одном представлении в 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; }
}
Я хочу редактировать объекты классов BOTH в режиме SINGLE, поэтому мне нужно что-то вроде:
@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 разрешен только один оператор модели. Может быть, есть обходное решение?
Ответы
Ответ 1
Создайте модель родительского представления, содержащую обе модели.
public class MainPageModel{
public Model1 Model1{get; set;}
public Model2 Model2{get; set;}
}
Таким образом, вы можете добавить дополнительные модели на более позднюю дату с минимальными усилиями.
Ответ 2
Чтобы использовать кортеж, необходимо сделать следующее, в представлении измените модель на:
@model Tuple<Person,Order>
чтобы использовать методы @html, вам нужно сделать следующее:
@Html.DisplayNameFor(tuple => tuple.Item1.PersonId)
или же
@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);
}
Другой пример: несколько моделей в представлении
Ответ 3
Другой вариант, который не нуждается в создании пользовательской модели, заключается в использовании Tuple < > .
@model Tuple<Person,Order>
Это не так чисто, как создание нового класса, который содержит оба, в соответствии с ответом Andi, но он жизнеспособен.
Ответ 4
Если вы являетесь поклонником очень плоских моделей, просто чтобы поддержать представление, вы должны создать модель, специфичную для этого конкретного вида...
public class EditViewModel
public int PersonID { get; set; }
public string PersonName { get; set; }
public int OrderID { get; set; }
public int TotalSum { get; set; }
}
Многие люди используют AutoMapper для сопоставления своих объектов домена с их плоскими представлениями.
Идея модели представления заключается в том, что она просто поддерживает представление - ничего другого. У вас есть один для каждого представления, чтобы убедиться, что он содержит только то, что требуется для этого представления, а не множество свойств, которые вы хотите использовать для других представлений.
Ответ 5
ОК, все имеют смысл, и я взял все части и поместил их сюда, чтобы помочь новичкам, таким как я, которые нуждаются в начале объяснения.
Вы делаете свой большой класс, который содержит 2 класса, в соответствии с ответом @Andrew.
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" })
А.,.back на ранчо, когда приходит сообщение, обратитесь к Большому классу:
public ActionResult ContactNewspaper(teamBoards teamboards)
и использовать возвращаемую модель (ы):
string yourVariable = teamboards.Team.yourField;
Вероятно, в классе есть некоторые свойства проверки DataAnnotation и, вероятно, put if (ModelState.IsValid) в верхней части блока сохранения/редактирования.,
Ответ 6
Фактически существует способ использовать две или более моделей на одном представлении, не обертывая их в класс, содержащий оба.
Использование 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, как "модель", потому что это так, как это работает. Я не говорю, что это архитектурно идеально, но это возможно.
Ответ 7
Просто создайте единую модель представления со всей необходимой информацией в ней, нормальный, что я делаю, это создать модель для каждого представления, чтобы я мог быть конкретным для каждого представления, либо это, либо сделать родительскую модель, и наследовать ее. ИЛИ сделать модель, которая включает в себя оба представления.
Лично я просто добавлю их в одну модель, но я так делаю:
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)
}
Ответ 8
Вы можете использовать шаблон представления http://martinfowler.com/eaaDev/PresentationModel.html
В этой презентации модель "Вид" может содержать как Person, так и Order, этот новый
класс может быть моделью вашего представления.
Ответ 9
Другим способом, о котором никогда не говорили, является
Создайте представление в MSSQL со всеми данными, которые вы хотите представить. Затем используйте LINQ to SQL или что-то другое для его сопоставления. В вашем контроллере верните его в представление. Готово.
Ответ 10
вы не можете объявить две модели на одном представлении, попробуйте использовать Html.Action("Person", "[YourController]")
и Html.Action("Order", "[YourController]")
.
Удачи.
Ответ 11
Помимо одной модели представления в 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" />
Ответ 12
Надеюсь, вы найдете его полезным!
Я использую ViewBag для Project и Model для задачи, поэтому таким образом я использую две модели в одном представлении и в контроллере i, определяемом значением или данными просмотра.
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
});