MVC模型绑定岗位值最佳实践

时间:2017-06-28 03:10:21

标签: asp.net-mvc data-binding

我正在试图弄清楚我所做的事情是否存在缺陷或可接受。具体来说,我正在质疑我在'Timeframes'属性中返回控制器的NULL值。 'Timeframe'(单数)属性包含值,因此一切都很好。但是,这只是模型绑定的工作原理,用于填充DDL的属性(Timeframes)是否为null?这是最好的做法,我正在做的很好吗?这是不是需要发送价值的担忧......性能问题?

Timeframe =用于在Post

上将值返回给Controller

Timeframes =用于填充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;
}

1 个答案:

答案 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
}