2011-05-05 3 views
2

MVC3을 사용하여 SelectList의 선택된 값을 올바르게 설정하면 HttpGet에서 뷰가 렌더링되지만 HttpPost에서 올바르게 렌더링되지 않습니다. 모델이 HttpPost의 View로 전달되기 전에 모델을 검사했으며 올바르게 업데이트되고 있습니다.보기가 선택된 태그를 올바르게 렌더링하지 못하는 것처럼 보입니다.SelectList SelectedValue가 HttpGet에서 작동하지만 HttpPost에서 작동하지 않는 이유는 무엇입니까?

HttpPost에서 <select>은 편집 후에도 양식을 제출하기 전과 동일하게 렌더링됩니다. HttpPost 메서드의 m.SelectedWidgetId = 2;이 실행되고 모델이 업데이트되지만보기에는 반영되지 않습니다.

무엇이 여기에 있습니까?

모델 :

public class WidgetModel 
{ 
    private Widget[] Widgets { 
     get 
     { 
      return new Widget[] { 
       new Widget { Id=1, Name="Item 1" }, 
       new Widget { Id=2, Name="Item 2" }, 
       new Widget { Id=3, Name="Item 3" } 
      }; 
     } 
    } 
    public SelectList WidgetList 
    { 
     get 
     { 
      return new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId); 
     } 
    } 
    public int SelectedWidgetId { get; set; } 
} 

보기 :

@model thisProject.Models.WidgetModel 

@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.SelectedWidgetId, Model.WidgetList, "Select...");  
    <input type='submit' />                      
} 

컨트롤러 방법; selectList의의 selectedvalue을 MVC asp.net에서

public ActionResult Widget() 
{ 
    var m = new WidgetModel(); 
    m.SelectedWidgetId = 1; 
    return View(m); 
} 
[HttpPost] 
public ActionResult Widget(WidgetModel m) 
{ 
    m.SelectedWidgetId = 2; 
    return View(m); 
} 

답변

3

HTML 도우미는 값을 렌더링 할 때 모델의 요청보다 항상 요청의 값을 사용하기 때문에 이러한 상황이 발생합니다. 이것은 기본적으로 당신이 POST 액션에서 어떤 값을 수정하려면 먼저 모델 상태에서 제거해야한다는 것을 의미 :

[HttpPost] 
public ActionResult Widget(WidgetModel m) 
{ 
    ModelState.Remove("SelectedWidgetId"); 
    m.SelectedWidgetId = 2; 
    return View(m); 
} 

또는 도우미는 단순히 수동으로 설정하는 값을 무시하고 하나를 사용할 것 사용자가 게시했습니다.

+0

내 문제가 바로 끝났습니다. 고맙습니다. –

+1

@ 다린 - 어떻게 그렇게 똑똑해 졌니? :) – Sam

2

우리가 강력하게 Model.selectedwidgetID이 경우 값에 도우미 즉

<%:Html.DropDownListFor(x=>x.SelectedWidgetID, ---,----)%> 

입력을 사용할 때 드롭 다운이 생성되는 속성의 값에 의해 재정의

new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId); 
관련 문제