2013-04-17 2 views
2

나는 일반적으로 asp .net 및 mvc에 새로운 편이다. 컨트롤러의 GET 편집 및 POST 편집 메소드를 구현하고 있습니다. 양식을 편집하기 위해 강력한 형식의보기를 사용하고 있습니다. 모델을 POST 편집 메서드로 다시 전달할 것이지만이를 저장하는 방법을 모른다. 여기에 내가 지금까지 가지고있는 것이있다 ... 그것은 내가 많이 알지 못한다.POST 편집에서 양식을 저장하는 올바른 방법은 무엇입니까?

[HttpPost] 
    public ActionResult ModifyContract(ModContract mod) 
    { 
     // submit modified contract 
     if (ModelState.IsValid) 
     { 
      OutlookMediaEntities1 db = new OutlookMediaEntities1(); 
      db.ObjectStateManager.ChangeObjectState(mod, EntityState.Modified); 

      // save changes 
      db.SaveChanges(); 

      return RedirectToAction("ContractDetails", "Contract", new { id = (int) ViewData["contractid"] }); 
     } 
     else 
     { 
      ModelState.AddModelError("", "Missing necessary information"); 
      return View(); 
     } 
    } 

db.ObjectStateManager ... 행에서 InvalidOperationException이 발생합니다. 기본 키를 할당하지 않았고 내 ModAds 클래스 (아래)에 기본 키가 포함되어 있지 않음을 알았 기 때문에 무언가를 보았습니다. 추가했지만 동일한 오류가 발생합니다. 여기에 스택 트레이스는 다음과 같습니다


[InvalidOperationException: The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'oulookmediaweb.Models.ModContract'.] 
    System.Data.Objects.ObjectStateManager.ChangeObjectState(Object entity, EntityState entityState) +278 
    oulookmediaweb.Controllers.ContractController.ModifyContract(ModContract mod) in C:\Users\georgiev.1\Outlook4\oulookmediaweb\Controllers\ContractController.cs:1113 
    lambda_method(Closure , ControllerBase , Object[]) +163 
    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +205 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27 
    System.Web.Mvc.Async.c__DisplayClass42.b__41() +28 
    System.Web.Mvc.Async.c__DisplayClass8`1.b__7(IAsyncResult _) +12 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +50 
    System.Web.Mvc.Async.c__DisplayClass39.b__33() +58 
    System.Web.Mvc.Async.c__DisplayClass4f.b__49() +237 
    System.Web.Mvc.Async.c__DisplayClass37.b__36(IAsyncResult asyncResult) +12 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50 
    System.Web.Mvc.Async.c__DisplayClass2a.b__20() +24 
    System.Web.Mvc.Async.c__DisplayClass25.b__22(IAsyncResult asyncResult) +126 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +45 
    System.Web.Mvc.c__DisplayClass1d.b__18(IAsyncResult asyncResult) +14 
    System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +25 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +61 
    System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +25 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +49 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 
    System.Web.Mvc.c__DisplayClass8.b__3(IAsyncResult asyncResult) +28 
    System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +25 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +49 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8970141 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 

여기뿐만 아니라 모델의 :

public class ModContract 
{ 
    public int contract_id; 
    public string contract_name { get; set; } 
    public List<ModAds> ads; 

    public string print_product_id { get; set; } 
    public string print_ad_option_id { get; set; } 
} 

public class ModAds 
{ 
    public int contr_ad_id; 
    public string name; 
    public string product_name; 
    public string adv_product; 
    public List<string> editions; 
    public double freq_disc; 
    public double other_dis_dol; 
    public double? other_dis_per; 
    public string non_cash_note; 
    public double non_cash_cons; 
} 

내가 어떻게 전달되는 모델을 저장하는 아무 생각이 없습니다. 내가 검토 한 모든 튜토리얼은 정말 간단 모델을 가지고 구원은 내가 내 코드에 넣을 때

db.Entry(model).State = EntityState.Modified; 
db.SaveChanges(); 

첫 번째 줄도 컴파일되지 않습니다, 같은 이루어집니다; 그것은 Entry 메소드가 없다고 말합니다. 모델이 양식 필드에서 새 값을 얻는 방법은 무엇입니까? 뷰가 모델을 매개 변수로 전달하는 것을 어떻게 알 수 있습니까? 보기가 강하게 입력 되었기 때문입니까? 그렇지 않다면 어떻게 될까요? 보기가 모든 입력을 반올림하고 양식 요소에서 항목을 선택하여 모델에 넣습니까? 나는 그것이 어떻게 작동하는지 혼란 스럽다. 그리고 가장 중요한 것은 어떻게 모델을 저장합니까?

도움이 될만한 링크 또는 도움을 받으실 수 있습니다! 미리 감사드립니다!

+0

당신이 말하는 "모델"나는 사람들은 당신이 당신의 데이터베이스에서 쿼리 및 뷰에 전달할 엔티티를하는 것 같은데요? –

+0

예, GET 편집에서 데이터베이스를 쿼리하고 조회 한 항목을 모델에 넣은 다음 View (모델)를 반환합니다. – maus

+0

EF 4.1 이상을 사용하고 있습니까? –

답변

3

첫 번째 줄은 코드에 넣어도 컴파일되지 않습니다. 그것은 엔트리 메소드가 없다고 말합니다.

이것은 이전 버전의 EF를 사용했기 때문일 가능성이 큽니다. 4.1 전에 EF는 Entry 메서드가없는 ObjectContext을 사용합니다. EF 4.1+에서는 Entry 메서드가있는 DbContext를 사용합니다. 또한 mod이라는 매개 변수가 있고 model이라는 변수를 저장하면 오타가 발생합니까? a great tutorial on EF and MVC here이 있습니다.

모델이 양식 필드에서 새 값을 얻는 방법은 무엇입니까? 뷰가 모델을 매개 변수로 전달하는 것을 어떻게 알 수 있습니까?

model binding that is greatly explains here입니다.

보기가 강하게 입력 되었습니까? 그렇지 않은 경우 어떻게됩니까

?

HTML 요소의 이름을 올바르게 지정하면 모델 바인딩을 이용할 수 있습니다.예를 들어, 컨트롤러 메소드 선언이 같은 :

[HttpPost] 
ActionResult Product(int id, string name) { 
} 

당신은 매개 변수 이름과 일치하여 요소 이름을 경우는 일이다 할 수있는 모델 바인더 :

<input type="hidden" name="id"/> 
<input type="text" name="name" id="name"/> 

이보기 라운드를 모두 하는가를 입력 및 양식을 양식에 물건을 선택하고 모델에 넣어?

모델 바인딩을 참조하십시오.

가장 중요한 것은 어떻게 모델을 저장합니까?

[HttpPost] 
public ActionResult ModifyContract(ModContract mod) 
{ 
    // do some validation or anything else you need to do here 
    // then save your entity 
    db.Entry(mod).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
+0

"EF 4.1+ DbContext 사용"에 대한 확신이 있습니까? 그 코드는 처음에는 DbContext를 사용하고 EF 버전과 관계없이 먼저 ObjectContext를 사용한다고 생각했습니다. 나는 틀린 것일지도 모른다. DbContext 생성기 템플릿을 사용하여 모델에서 DbContext를 먼저 생성 할 수 있습니다. 내 생각 엔, Asker가 Model First를 사용하고 있지만 Code First를 사용하는 MVC 예제 코드가 있습니다. – AaronLS

+0

위대한 대답. – AaronLS

+0

감사합니다. 고마워요! EF 4.0을 사용하고 있기 때문에 db.Entry가 작동하지 않습니다. db.Entry 라인은 내 코드의 일부가 아니 었습니다 (작동하지 않아서 제거했습니다), 제가 튜토리얼에서 보았던 것을 설명하기를 원했습니다. 마치 LOL에 링크 된 것과 같습니다. EF 4.0 자습서 링크 – maus

관련 문제