2011-02-25 5 views
0

나는 ASP.net MVC 3을 사용하는 데 상당히 새로운 사람이기 때문에 나를 용서해 준다.ASP.net MVC 3 - 편집 도중 DropDownList가 업데이트되지 않습니까?

나는 두 개의 테이블을 가지고 있는데 하나는 계약서, 하나는 Sow라고 불린다. 계약에는 SOW를 가리키는 외래 키가 있습니다. 계약 세부 정보를 편집하고 선택할 수있는 다양한 SOW 레코드의 드롭 다운 목록을 제공 할 수 있습니다. 현재 코드 : 내 계약 컨트롤러에서

: 내 Edit.aspx에서

public ActionResult Edit(int id) 
    { 
     Contract contract = contractRepository.GetContract(id); 

     var db = new ManagementDataContext(); 
     IEnumerable<SelectListItem> items = db.Sows 
      .Select(s => new SelectListItem() 
      { 
       Value = s.ID.ToString(), 
       Text = s.Title 
      }); 
     ViewData["Sow"] = items; 

     return View(contract); 
    } 
[HttpPost] 
     public ActionResult Edit(int id, FormCollection collection) 
     { 
      Contract contract = contractRepository.GetContract(id); 

      try 
      { 
       UpdateModel(contract); 
       contractRepository.Save(); 

       return RedirectToAction("Details", new {id = contract.contractID}); 
      } 
      catch 
      { 
       ModelState.AddRuleViolations(contract.GetRuleViolations()); 

       var db = new ManagementDataContext(); 
       IEnumerable<SelectListItem> items = db.Sows 
        .Select(s => new SelectListItem() 
        { 
         Value = s.ID.ToString(), 
         Text = s.Title 
        }); 
       ViewData["Sow"] = items; 

       return View(); 
      } 
     } 

:

<%: Html.DropDownList("Sow") %> 

목록은 값으로 채워집니다,하지만 난 갱신을 변경하고, 외부 키 변하지 않는다. 조언이나 도움이 필요하십니까? 또한, 현재 코드를 향상시킬 수있는 방식으로 던지고 싶다면?

다시 말해, ASP.net 지식 부족에 대해 사과 하긴하지만 손을 더럽 히고 실수를해서 배워야합니다.

답변

0

이것은 name="Sow"으로 선택을 생성합니다.

원하는 것은 입력을 바인딩하려는 FK 속성과 동일한 이름으로 지정하는 것입니다.

아마 <%: Html.DropDownList("SowId") %>

0

같은 첫째, 내가보기 엔 당신이 AutoMapper와 뷰 모델 패턴을 사용하는 것이 좋습니다. 당신이

public ActionResult Edit(int id) 
{ 
    Contract contract = contractRepository.GetContract(id); 

    var db = new ManagementDataContext(); 
    IEnumerable<SelectListItem> items = db.Sows 
     .Select(s => new SelectListItem() 
     { 
      Value = s.ID.ToString(), 
      Text = s.Title 
     }); 
    ViewData["SowItems"] = items; 

    return View(contract); 
} 

같은 것을 할 경우 무엇이든간에, 당신 시나리오에서 작동해야합니다 귀하의보기 :

<%: Html.DropDownList("SowId", ViewData["SowItems"]) %> 

가능한 문제는 ModelState 함께 할 수 있으며, 지금 당장 명확한에게 줄 수 없습니다 설명.

는 일부 코드 도움을 혼합하려고하는 것이 당신

0

에게 몇 가지 방법을 도움이되기를 바랍니다.

1 : 대신 FormCollection의 계약 매개 변수, 계약의 필드가 입력 필드의 이름은로

[HttpPost] 
public ActionResult Edit(Contract contract) 

만큼, 당신이있는 많은 청소기를 허용하도록 [HttpPost] 편집 방법을 변경 MVC 툴킷으로 설정된 객체를 계약 객체에 매핑 한 다음 Action 메소드에 전달합니다. 이렇게하면 눈에 거슬리지 않는 유효성 검사를 활용할 수 있습니다. MVC 프레임 워크는 Action 메서드에 도달하기 전에 모델 개체에 대한 데이터 입력의 유효성을 검사합니다. 비즈니스 규칙 유효성 검증 또는 데이터 모델 관계 검증을 수행해야하지만, 도움이됩니다.

두 번째 : View에서 SelectLists를 만드는 것이 더 좋을 수도 있지만 SelectList는 확실히 Control 또는 Model과 아무 관련이없는 데이터의 추상화입니다. 여기서는 할 수있는 방법이 있습니다. ViewModel이 유용하게 사용되는 곳입니다. [ViewModel에 대한 자세한 내용은 문자열을 사용하여 ViewData에서 Objects로 개체를 가져 오는 것을 돕습니다. 일부 경우 (선택 목록과 같은) 컴파일 할 때 캐스트해야 할 수도 있습니다 ]

컨트롤러 코드

var model = new ContractViewModel() 
{ 
    Contract = contractRepository.GetContract(id), 
    Sows = db.Sows.ToList() // ToList() is important here to ensure the data is pulled into the Model 
} 
// Do any other initializations here 
ViewData.Model = model; 
return View(); 

보기 코드

<%= Html.DropDownListFor(model => model.Contract.Sow, new SelectList(Model.Sows, "ID", "Title")) %> 

대안은 하나이 당신을 위해 작동하지 않습니다 또는 다른 검증이 필요한 경우는 다음과 같습니다

컨트롤러 코드

[HttpPost] 
public ActionResult Edit(Contract contract, int sowID) 

보기 코드

<%= Html.DropDownList("sowID", new SelectList(Model.Sows, "ID", "Title")) %> 

희망이 도움이됩니다.

관련 문제