DropDownListFor not binding on Edit View with repeating items (List)

后端 未结 1 1449
忘了有多久
忘了有多久 2020-12-06 11:38

Here is the thing. I have an Edit view, which doesnt bind the dropdowns\' value when I open it.

    [NonAction]
    public List VraagTy         


        
相关标签:
1条回答
  • 2020-12-06 12:22

    It seems this is really a bug or at least inconsistency in ASP.NET MVC 2. I have examined its source and found what InputHelper() method called from TextBoxFor() helper receives default value calculated with

    ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model
    

    But SelectInternal() method called from DropDownListFor() helper receives only a name of a control found with ExpressionHelper.GetExpressionText() method.

    So SelectInternal() tries to find default value using ViewData.Eval() method from MVC 1. It's known what this method isn't able to extract values from arrays by numeric index.

    So in your case are applicable

    <%: Html.DropDownListFor(model => model.Sch_ID) %>
    <%= Html.TextBoxFor(model => model.Vragen[i].Evvr_Type)%>
    

    but not

    <%: Html.DropDownListFor(model => model.Vragen[i].Evvr_Type) %>
    

    because it's equivalent to

    <%: Html.DropDownList("Vragen[" + i + "].Evvr_Type") %>
    

    At the same time I want to emphasize again what

    <%= Html.TextBoxFor(model => model.Vragen[i].Evvr_Type)%>
    

    isn't equivalent to

    <%= Html.TextBox("model.Vragen[" + i + "].Evvr_Type")%>
    

    because latter even in MVC 2 can't bind default value.

    Possible workarounds

    First. Since SelectInternal() also checks ModelState dictionary you can fill this dictionary before returning the view.

    for (int i=0; i < fevb.Vragen.Count(); i++)
        ModelState.Add("Vragen[" + i + "].Evvr_Type", new ModelState
        {
            Value = new ValueProviderResult(fevb.Vragen[i].Evvr_Type, null, 
                CultureInfo.CurrentCulture) 
        });
    

    This will be done by MVC itself after from post, so you should do it manually only first time.

    Second. Instead of

    <%= Html.DropDownListFor(model => model.Vragen[i].Evvr_Type, 
        ViewData["vraagtype"] as List<SelectListItem>)%>
    

    use

    <%= Html.DropDownListFor(model => model.Vragen[i].Evvr_Type, 
        new SelectList(ViewData["vraagtype"] as IEnumerable, "Value", "Text",
            Model.Vragen[i].Evvr_Type))%>
    

    ViewData["vraagtype"] in this case doesn't have to contain objects of SelectListItem, any IEnumerable is enough. You may check SelectList() method description in case of need.

    0 讨论(0)
提交回复
热议问题