我正在试图弄清楚我所做的事情是否存在缺陷或可接受。具体来说,我正在质疑我在'Timeframes'属性中返回控制器的NULL值。 'Timeframe'(单数)属性包含值,因此一切都很好。但是,这只是模型绑定的工作原理,用于填充DDL的属性(Timeframes)是否为null?这是最好的做法,我正在做的很好吗?这是不是需要发送价值的担忧......性能问题?
Timeframe =用于在Post
上将值返回给ControllerTimeframes =用于填充DDL值
在视图上下拉列表框:
@Html.DropDownListFor(m => m.Timeframe, Model.Timeframes)
型号:
public class ABCModel
{
public List<SelectListItem> Timeframes { get; set; }
public string Timeframe { get; set; }
}
控制器:
[HttpPost]
public void TestControllerMethod(ABCModel model)
{
//this value is null.
var timeFrames = model.Timeframes;
//this value is populated correctly
var timeFrame = model.Timeframe;
}
答案 0 :(得分:1)
表单仅回发其成功控件的名称/值对。您已为属性Timeframe
创建了表单控件,因此您可以在POST方法中获取所选选项的值。
您没有(也不应该)为SelectListItem
属性中的每个Timeframes
的每个属性创建表单控件,因此在提交表单时,请求中不会发送任何与之相关的内容,因此Timeframes
的值为null
。
如果由于ModelState
无效而需要返回视图,则需要像在GET方法中那样重新填充TimeFrames
属性(否则您的DropDownListFor()
会抛出一个例外)。典型的实现看起来像
public ActionResult Create()
{
ABCModel model = new ABCModel();
ConfigureViewModel(model);
return View(model);
}
[HttpPost]
public ActionResult Create(ABCModel model)
{
if (!modelState.IsValid)
{
ConfigureViewModel(model);
return View(model);
}
// Save and redirect
}
private void ConfigureViewModel(ABCModel model)
{
model.TimeFrames = ....; // your code to populate the SelectList
}