2012-04-21 3 views
0

저는 MVC3을 처음 사용 합니다만, 지금까지는 제 코드가 훌륭하게 유지되고 있습니다.양식에 모델에 추가 한 다음 양식을 다시 추가하십시오.

이제 사용자가 직원 이름을 나타내는 텍스트 문자열을 입력 할 수있는 간단한 양식을 만들고 싶습니다. 그런 다음이 양식을 제출하여 내 모델에 일종의 목록으로 저장하고자합니다. 양식을 다시 표시해야하고 for-each 루프는 이미 추가 된 이름을 기록합니다. 작업을 마쳤고이 정보를 데이터베이스에 저장해야합니다.

내가 알아낼 수없는 것은 데이터베이스에 저장하기 전까지이 임시 정보를 저장하는 방법입니다. 제가 제출할 때마다 밀어 붙이기는하지만 할 수있는 일이 있습니다.

여러분도 제가 뭘 하려는지보고 희망적인 해결책이 있기를 바랍니다. :)

이 내가 할 노력했습니다 무엇의 단순화 된 버전입니다 :

모델에게

public class OrderModel 
{ 
    public virtual ICollection<Employees> EmployeesList { get; set; } 

    public virtual Employees Employees { get; set; } 
} 

public class Employees 
{ 
    [Key] 
    public int ID { get; set; } 

    public string Name { get; set; } 
} 

보기

@model OrderModel 
@{ 
    if (Model.EmployeesList != null) 
    { 
     foreach (var c in Model.EmployeesList) 
     { 
      @c.Name<br /> 
     } 
    } 
} 
@using(Html.BeginForm()) 
{ 
    @Html.TextBoxFor(m => m.Employees.Name) 

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

컨트롤러

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    model.EmployeesList.Add(model.Employees); 
    // This line gives me the error: "System.NullReferenceException: Object reference not set to an instance of an object." 

    return View(model); 
} 

답변

1

난 당신이 페이지에 직원 목록을 연소하여 처리한다고 생각합니다. 지금 당장 귀하는 귀하의 양식에 목록을 인식 할 수있는 방법을 제공하지 않습니다.

EditorTemplates 파일에서

에게 이름 종업원 수 :보기에

@model Employees 

@Html.HiddenFor(m => m.ID) 
@Html.HiddenFor(m => m.Name); 

:이 방법의 추가 보너스로

@using(Html.BeginForm()) 
{ 
    @Html.EditorFor(m => m.EmployeesList) 
    @Html.TextBoxFor(m => m.Employees.Name) 

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

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    if (model.EmployeesList == null) 
     model.EmployeesList = new List<Employees>(); 

    model.EmployeesList.Add(model.Employees); 
    return View(model); 
} 

, 사용자가이 결코 있도록 아약스를 쉽게 추가 할 것 새 직원을 추가 할 때 페이지를 남겨 두십시오 (자바 스크립트로 새로운 숨겨진 값을 삽입하고 아약스를 피할 수 있습니다. 게시물에서 목록에 추가하는 것 외에 다른 작업을 수행하는 경우에만 의존 할 수 있습니다).

+0

감사합니다. 이 접근 방식은 완벽하게 작동했습니다. – holaq

1

TempData에 적합하다고 생각합니다. 거기에는 캐시와 같은 종류의 것을 저장할 수 있지만 캐시와 달리 다음 요청 때까지만 지속됩니다. 이를 구현하려면,이 (단지 예)와 같은 작업 방법을 변경 :

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    dynamic existingItems = TempData["existing"]; 
    if (existingItems != null) 
    { 
     foreach (Employee empl in existingItems) 
      model.EmployeesList.Add(empl); 
    } 
    model.EmployeesList.Add(model.Employees); 
    TempData["existing"] = model.EmployeesList; 
    return View(model); 
} 
+0

"System.NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다." 오류 "model.EmployeesList.Add (model.Employees);" 전에했던 것처럼. 나는이 문제에 대해 언급하는 것을 잊었다. – holaq

+0

@holaq, 틀림없이 model.EmployeesList가 포스트 백 이후에 null이기 때문에 의심의 여지가 없습니다. 나는 그것을 만들기 위해 나의 대답을 업데이트했다. (ICollection에 익숙하지 않기 때문에 구문이 제대로 작동하는지 확신 할 수 없습니다.) – McGarnagle

+0

이렇게하면 작동합니다. 직원 목록이 사라지는 페이지를 새로 고치면 문제가 해결됩니다. – DMulligan

관련 문제