【问题标题】:can i have dynamic model for mvc view我可以有 mvc 视图的动态模型吗
【发布时间】:2014-06-14 10:32:19
【问题描述】:

我正在.Net MVC 项目中开发一个创建表单。我将为这个问题创建一个简单的演示,尽可能接近我的真实业务场景。

我有一个 person 类和几个继承自它的其他类。

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; }
}

如果我有如下创建的 Action 方法。

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")
}

【问题讨论】:

  • 为什么不将 Person 定义为模型?
  • 谢谢@Uriil ..你是对的。我不知道我能做到这一点。

标签: c# asp.net-mvc asp.net-mvc-views


【解决方案1】:

不幸的是,文件中只允许使用一个 @model 声明,因此不支持您尝试实现的逻辑。如果您只使用@Html.EditorForModel(),您可以使用@model WebApplication1.Models.Person,您将生成正确的编辑器表单。

【讨论】:

  • 这正是我想要的 dotnetom。谢谢。我不知道为什么我根本没有尝试将模型设置为 Person 。我只是认为它不会完成这项工作,因为作为基类的 Person 没有继承类的属性。
猜你喜欢
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多