두 가지 모델이 있습니다.
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; }
}
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 파일에는 하나의 ‘model’문만 허용됩니다. 몇 가지 해결 방법이 있습니까?
답변
두 모델을 모두 포함하는 상위 뷰 모델을 만듭니다.
public class MainPageModel{
public Model1 Model1{get; set;}
public Model2 Model2{get; set;}
}
이렇게하면 최소한의 노력으로 나중에 모델을 추가 할 수 있습니다.
답변
튜플을 사용하려면 다음을 수행해야합니다. 뷰에서 모델을 다음과 같이 변경합니다.
@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);
}
또 다른 예 : 뷰의 여러 모델
답변
커스텀 모델을 생성 할 필요가없는 또 다른 옵션은 Tuple <> 을 사용하는 것 입니다.
@model Tuple<Person,Order>
Andi의 답변에 따라 둘 다 포함하는 새 클래스를 만드는 것만 큼 깨끗하지는 않지만 실행 가능합니다.
답변
매우 평평한 모델을 선호하는 경우보기를 지원하기 위해이 특정보기에 특정한 모델을 만들어야합니다.
public class EditViewModel
public int PersonID { get; set; }
public string PersonName { get; set; }
public int OrderID { get; set; }
public int TotalSum { get; set; }
}
많은 사람들이 AutoMapper를 사용하여 도메인 개체에서 플랫 뷰로 매핑합니다.
뷰 모델의 아이디어는 단지 뷰를 지원한다는 것입니다. 다른보기에 대해 원하는 속성로드가 아닌 해당보기에 필요한 것만 포함하도록보기 당 하나씩 있습니다.
답변
좋아요, 모두 이해가 되셨고 저는 모든 조각을 가져 와서 설명을 끝낼 필요가있는 저와 같은 초보자를 돕기 위해 여기에 두었습니다.
@Andrew의 답변에 따라 2 개의 클래스를 보유한 큰 클래스를 만듭니다.
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);
보기 상단
@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 at the ranch, Post가 들어 오면 Big Class를 참조하십시오.
public ActionResult ContactNewspaper(teamBoards teamboards)
모델이 반환 한 내용을 활용합니다.
string yourVariable = teamboards.Team.yourField;
아마도 클래스에 DataAnnotation Validation 항목이있을 것이고 아마도 저장 / 편집 블록의 맨 위에 if (ModelState.IsValid)를 넣을 것입니다. . .
답변
사실 두 개 이상의 모델을 둘 다 포함하는 클래스로 래핑하지 않고 하나의 뷰에서 사용하는 방법이 있습니다.
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에있는 모든 것을 “모델”로 사용할 수 있습니다. 그래도 작동하는 방식이기 때문입니다. 이것이 건축 적으로 이상적이라고 말하는 것은 아니지만 가능합니다.
답변
필요한 모든 정보가 포함 된 단일 뷰 모델을 생성합니다. 일반적으로 모든 뷰에 대해 모델을 생성하여 모든 뷰를 구체적으로 지정하거나 상위 모델을 만들고 상속 할 수 있습니다. 또는 두 뷰를 모두 포함하는 모델을 만드십시오.
개인적으로 나는 그것들을 하나의 모델에 추가 할 것이지만 그것이 내가하는 방식입니다.
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)
}