2014-09-02 2 views
0

나는 다음 한 코드 :게시물 사이에 선택 해제하지 ListBoxFor

<div class="row form-group"> 
    @Html.LabelFor(x => x.GroupCriteria.Name, Translation.Name, new { @class = "col-sm-4 control-label" }) 
    <div class="col-sm-4"> 
     @Html.ListBoxFor(m => m.GroupCriteria.Name, Model.NameList, new { @class = "multi-select-custom" }) 
    </div> 
</div> 

... 

<button type="submit" name="removeCriterion" value="Name">X</button>Name: @(string.Join(",", Model.GroupCriteria.Name))</button> 

... 

<button type="submit">@Translation.Update</button> 

그리고 컨트롤러 : 이제

public ActionResult GetUsers(GroupCriteriaModel groupCriteria, string removeCriterion) 
{ 
    if("Name".Equals(removeCriterion)) groupCriteria.Name.Clear(); 
    ... 
    return View(modelWithCriterias); 
} 

무슨 일이 일어나고 있는지 :

I에 의해 일부 값의 선택을 취소/선택 선택을 클릭 한 다음 "업데이트"를 클릭하면 모든 것이 잘 작동합니다. 반환 된 페이지의 선택은 게시 된 것과 동일합니다.

"이름"을 지우려면 "X"를 클릭하십시오. "removeCriterion"은 "Name"과 동일하므로 이름 목록이 지워집니다 (디버거에서 비어 있음). 뷰에서 디버거 : "Model.GroupCriteria.Name"은 여전히 ​​비어 있으며 "Model.NameList"중 하나도 "Selected"(true로 설정)입니다. 그러나 반환 된 HTML은 이전과 같은 선택을 포함합니다 (동일한 항목의 속성은 'selected = "selected"'입니다).

MVC에서 수행하는 일종의 캐싱입니까? 이것을 피하는 방법?

답변

0

그것은 ModelState에서 바인더 제본되고, 그래서 당신은 그것을 취소해야 가능성이 높습니다 : 좀 더 구체적인 방법으로 작업을 수행하려는 경우, 당신은 단지 국가 관련 제거하기 위해 ModelState.Remove()을 사용할 수 있습니다

if("Name".Equals(removeCriterion)) 
{ 
    groupCriteria.Name.Clear(); 
    ModelState.Clear(); 
} 

귀하의 ListBox에.

관련 문제