2014-06-14 2 views
1

.Net MVC 프로젝트에서 Create 양식을 개발 중입니다. 나는 실제 비즈니스 시나리오에서 가질 수있는 질문에 대한 간단한 데모를 작성하겠습니다.mvc보기에 대한 동적 모델을 가질 수 있습니다.

저는 개인 클래스와 그로부터 계승 된 몇 가지 다른 클래스가 있습니다.

public class Person 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Forename { get; set; } 
    [Required] 
    public string Surname { get; set; } 
    [Required] 
    public DateTime Dob { get; set; } 
} 

public class Teacher: Person 
{ 
    [Required] 
    public string Department { get; set; } 
} 

public class Student: Person 
{ 
    [Required] 
    public string TermAddress { get; set; } 
} 

아래와 같은 생성 방법이있는 경우

public class PersonController : Controller 
{ 
public ActionResult Create() 
    { 
     var personFactory = new PersonFactory(); 
     var p = personFactory.CreatePerson("student"); 
     return View(p); 
    } 
} 
public class PersonFactory 
{ 
    public object CreatePerson(string type) 
    { 
     switch(type) 
     { 
      case "teacher": 
       return new Teacher(); 
       break; 
      case "student": 
       return new Student(); 
       break; 
      default: 
       return null; 
        break; 

     } 
    }    
} 

두 경우를 모두 처리 할 수있는보기가 가능합니까? 내 비즈니스 사례에는 10 개 이상의 다른 유형의 유사한 클래스가 있으며 10 개 이상의 뷰를 만들지 않고도 문제를 해결할 수있는 방법이 있는지 궁금합니다. 나는 내가보기에 강하게 타자를 치는 것을 알고있다. 그러나 그것은 멋지다. 하나의 뷰를 사용할 수있는 한 10 개 이상의 뷰 모델을 가질 수 있습니다. 이런 종류의 문제를 해결할 수있는 대안이나 제안은 환영합니다. 감사.

@{ 
    ????????????? just an idea .. something like that .. ??????????? 
    var type = "student"; 
    if(type == "stuent") 
    { 
     @model WebApplication1.Models.Student 
    } 
    else if(type == "teacher") 
    { 
     @model WebApplication1.Models.Teacher 
    } 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal">   

    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

    @Html.EditorForModel() 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Create" class="btn btn-default" /> 
     </div> 
    </div> 
</div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

왜 Person을 모델로 정의하지 않습니까? – Uriil

+0

감사합니다. @ 우릴 ... 당신 말이 맞아요. 나는 그저 할 수 있다는 것을 몰랐다. – lawphotog

답변

1

불행히도 @model 선언은 파일에 하나만 허용되므로 구현하려는 논리는 지원되지 않습니다. @Html.EditorForModel() 만 사용하는 경우 @model WebApplication1.Models.Person을 사용할 수 있으며 올바른 편집기 양식이 생성됩니다.

+0

그게 정확히 내가 원하는 dotnetom이야. 감사. 나는 왜 모델을 Person으로 설정하지 않았는지 모르겠습니다. 저는 Person 클래스가 상속 클래스의 속성을 가지고 있지 않기 때문에 Person 클래스가 그 일을하지 않을 것이라고 생각했습니다. – lawphotog

관련 문제