2011-04-09 7 views
1

MVC3에 문제가있는 경우이 문제에 대한 게시물이 있지만 찾을 수 없습니다. 나는 틀린 일을해야만합니다. for 루프를 사용하여 목록을 반복하는 간단한보기 (Index.cshtml)가 있습니다. 각 반복에서 목록 항목 중 하나의 값이있는 두 개의 텍스트 입력을 출력합니다.MVC3 - 에디터를 사용하는 데 문제가 있습니다.

@{Html.BeginForm();} 
@Html.Encode("\n") 
@for (int i = 0; i < Model.SortOptions.Count; i++) 
{ 
    @Html.TextBoxFor(m => m.SortOptions[i].ColumnName); 
    @Html.Encode("\n"); 
    @Html.TextBoxFor(m => m.SortOptions[i].Direction); 
    @Html.Encode("\n"); 
} 
<input type="submit" value="Submit" /> 
@{Html.EndForm();} 

저는보기에 GET 요청과 POST를위한 두 개의 컨트롤러가 있습니다. POST 버전은 GET 버전과 다른 항목을 목록에 추가합니다. 문제가 발생한 곳입니다. 페이지가 다시로드 된 후 텍스트 상자는 GET에로드 된 페이지와 동일한 값을 갖습니다.

처음에는 캐시 문제라고 생각했지만 코드를 수정하면 (아래 참조) 수동으로 텍스트 입력을 추가하고 html에 값을 삽입하면 브라우저에 새 값이 전송됩니다.

@{Html.BeginForm();} 
@Html.Encode("\n") 
@for (int i = 0; i < Model.SortOptions.Count; i++) 
{ 
    var columnNameName = string.Format("SortOptions[{0}].ColumnName", i); 
    var columnNameID = string.Format("SortOptions_{0}__ColumnName", i); 
    var directionName = string.Format("SortOptions[{0}].Direction", i); 
    var directionID = string.Format("SortOptions_{0}__Direction", i); 

<input type="hidden" name="@columnNameName" id="@columnNameID" value="@Model.SortOptions[i].ColumnName" /> 
<input type="hidden" name="@directionName" id="@directionID" value="@Model.SortOptions[i].Direction" /> 

} 
<input type="submit" value="Submit" /> 
@{Html.EndForm();} 

나는 모델에 예상 값이 포함되어 있는지 확인하기 위해 코드를 단계별로 실행했습니다. 심지어보기에서 코드를 단계별로 실행하여 목록의 값을 검사했습니다. 올바른 값을 가지고있는 것처럼 보입니다. 그러나 브라우저에서 볼 때 페이지가 GET 요청에 응답했을 때와 일치해야하는 값이 있습니다. 에디터 템플릿에 문제가 있습니까? 방금 mvc3과 면도기 엔진을 사용하기 시작 했으므로 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다.

----- UPDATE : ADDED 컨트롤러 코드 ----

[HttpGet] 
    public ActionResult Index() 
    { 
     var inv = new InventoryEntities(); 
     var model = new IndexModel(inv); 
     model.SortOptions = new List<SortOption>(); 
     model.SortOptions.Add(new SortOption { ColumnName = "Model", Direction = SortDirection.Ascending }); 
     model.SortOptions.Add(new SortOption { ColumnName = "Make", Direction = SortDirection.Ascending }); 
     //Load data 
     model.LoadEquipmentList(); 

     return View(model); 
    } 


    [HttpPost] 
    [OutputCache(Duration = 1)] 
    public ActionResult Index(List<SortOption> sortOptions, SortOption sort) 
    { 
     var inv = new InventoryEntities(); 
     var model = new IndexModel(inv); 
     ModelState.Remove("SortOptions"); 
     model.SortOptions = new List<SortOption>(); 
     model.SortOptions.Add(new SortOption { ColumnName = "Type", Direction = SortDirection.Descending }); 
     model.SortOptions.Add(new SortOption { ColumnName = "SubType", Direction = SortDirection.Descending }); 
     model.EquipmentList = new List<EquipmentListItem>(); 
     model.EquipmentList.Add(new EquipmentListItem { ID = 3, AssignedTo = "Mike", Location = "Home", Make = "Ford", Model = "Pinto", Selected = false, SubType = "Car", Type = "Vehicle" }); 

     return View(model); 
    } 
+0

컨트롤러 작업 코드를 게시 할 수 있습니까? – sarvesh

+0

컨트롤러 코드가 게시되었습니다. – m9k5j

답변

0

TextBoxFor과 같은 Html 도우미는 먼저 값을 바인딩 할 때 모델 상태를 사용하고 이후에는 모델을 사용한다는 점에 유의하십시오.

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel { Name = "foo" }); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     model.Name = "bar"; 
     return View(model); 
    } 
} 

하고 뷰 : :이 무엇을 의미하는지 설명하기 위해 매우 간단한 예를 생각해 보자

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(x => x.Name) 
    <input type="submit" value="OK" /> 
} 

양식을 제출할 때 이제 기대를 그 "bar"에 텍스트 상자의 값이 변경 그게 당신이 POST 작업에 넣었지만 값은 변하지 않습니다. 이는 사용자가 입력 한 내용이 포함 된 모델 상태의 Name 키가있는 값이 이미 있기 때문입니다. 당신이 원하는 경우이 작업을 그래서 당신은 모델 상태에서 원래의 값을 제거해야합니다

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    // remove the original value if you intend to modify it here 
    ModelState.Remove("Name"); 
    model.Name = "bar"; 
    return View(model); 
} 

같은 일뿐만 아니라 시나리오에서 발생합니다. 따라서 POST 액션에서 모델 상태에서 수정할 값을 제거해야 할 수도 있습니다.

+0

행운을 빌어 ModelState.Remove를 사용해 보았습니다. 나는 같은 결과를 얻는다. 두 컨트롤러 메서드에 대한 코드로 내 게시물을 업데이트합니다. – m9k5j

+0

좋아, 이것은 기본적으로 문제가되었다.여전히 모델 상태가 어떻게 작동하는지 완전히 이해하지는 못했지만 "ModelState.Clear();"를 추가하면 컨트롤러 메소드의 시작 부분에서 문제를 해결합니다. 나를 올바른 방향으로 가리켜 주셔서 감사합니다. – m9k5j

0

일이 나에게 튀어 몇 - 조금 더는 말을 열심히하지만 ...이 모두가 할 수 보지 않고 그 자체로 다시 써야한다. 추가 @ 기호는 필요하지 않습니다.

@using(Html.BeginForm()) { 
    Html.Encode("\n") 
    for (int i = 0; i < Model.SortOptions.Count; i++) { 
     Html.TextBoxFor(m => m.SortOptions[i].ColumnName); 
     Html.Encode("\n"); 
     Html.TextBoxFor(m => m.SortOptions[i].Direction); 
     Html.Encode("\n"); 
    } 
    <input type="submit" value="Submit" /> 
} 


@using (Html.BeginForm()) { 
    Html.Encode("\n"); 
    for (int i = 0; i < Model.SortOptions.Count; i++) { 
     var columnNameName = string.Format("SortOptions[{0}].ColumnName", i); 
     var columnNameID = string.Format("SortOptions_{0}__ColumnName", i); 
     var directionName = string.Format("SortOptions[{0}].Direction", i); 
     var directionID = string.Format("SortOptions_{0}__Direction", i); 

     <input type="hidden" name="@columnNameName" id="@columnNameID" value="@Model.SortOptions[i].ColumnName" /> 
     <input type="hidden" name="@directionName" id="@directionID" value="@Model.SortOptions[i].Direction" /> 

    } 
    <input type="submit" value="Submit" /> 
} 

그렇지 않으면 내 머리 꼭대기에서 이상한 것을 볼 수 없습니다.

+0

팁 @ 사용에 대해 감사드립니다. 두 프로젝트에 MVC2를 사용했지만 MVC3과 면도기를 사용하는 것은 처음입니다. – m9k5j

관련 문제