Могу ли я иметь динамическую модель для просмотра MVC

Я занимаюсь разработкой формы Create в.Net 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")
}

1 ответ

Решение

К сожалению, в файле разрешено только одно объявление @model, поэтому логика, которую вы пытаетесь реализовать, не поддерживается. Если вы используете просто @Html.EditorForModel(), вы можете использовать @model WebApplication1.Models.Person, и вы получите правильную сгенерированную форму редактора.

Другие вопросы по тегам