视图中的多个强类型模型

时间:2012-12-03 18:35:21

标签: asp.net-mvc

我正在尝试在MVC 4中创建一个“新建”页面。该页面将包含文本字段和下拉字段。我希望下拉框中列出的项目来自其他模型。

主要模型:(忽略语法,如下面的代码是一般例子)

public int MainID {get; set;}
public int location {get; set;}
...

someDetails模型:

public int detailID {get; set;}
public int MainID {get; set;}
...
public int actionID {get; set;}

动作模型:

public int actionID {get; set;}
public int location {get; set;}
public string action {get; set;}

SomeDetails包含有关Main的其他信息,并使用mainID进行关联。我有兴趣为someDetails创建“添加详细信息”页面。此页面的一部分将包含Action的下拉列表,该下拉列表基于location中的main字段。

实施下拉框的最佳方法是什么?我有一个解决方案,涉及在ViewBag中传递可能的值,但我已经看到这标记为不好的做法。我也在考虑可以将public int actionID {get; set;}更改为<List>Action类型。如果使用这个方法,我想我会让someDetails的构造函数填充列表?如果只是查看特定的someDetails,这是否会导致性能问题,因为每次都会尝试创建列表?

创建行动:

 public ActionResult Create(int id = -1)
    {
        if (id == -1)
        {
            //NOTE: INSERT REDIRECT HERE
        }
        someDetails model = new someDetails();
        model.MainID = id;
        return View(model);
    }

编辑: 根据要求,更好地解释业务逻辑 我显示的main model是在现有表格之后建模的,我无法更改,因为它是位于我的控件/组之外的数据仓库的一部分。我正在创建一个允许用户添加someDetails的应用程序,以便更好地查看/跟踪某些数据。 Action模型只根据位置显示可能的操作/操作ID。

我的应用程序将允许用户从main模型中搜索或过滤一组项目。然后,他们将被允许添加someDetails,这将显示一个包含一些文本字段的表单和一个用于选择操作的下拉列表。要获得action的可能值,我会执行SELECT * FROM Action a WHERE a.location = currentLocation

之类的操作

1 个答案:

答案 0 :(得分:2)

只需创建一个包含每个模型属性的ViewModel ......并且可以在控制器中填充ViewModel,然后将其传递给视图。

编辑:对于DropDownLists:

在您的ViewModel中,您需要一个属性用于选定的操作ID,另一个属性用于列表本身。

在模型中:

public int actionId { get; set;}
public SelectList ListOfActions { get; set;}
//Other model members

在视图中

@Html.DropDownListFor(model => model.actionId, Model.ListOfActions, "Select one action", new { @class = "yourclass" })

在你的控制器中:

var model = new YourViewModel();
model.ListOfActions = new SelectList(this.GetListOfActions(), "ActionName", "ActionId", [here the selected action id in case you need it])