我正在尝试在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
答案 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])