나는 일반적으로 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 메소드가 없다고 말합니다. 모델이 양식 필드에서 새 값을 얻는 방법은 무엇입니까? 뷰가 모델을 매개 변수로 전달하는 것을 어떻게 알 수 있습니까? 보기가 강하게 입력 되었기 때문입니까? 그렇지 않다면 어떻게 될까요? 보기가 모든 입력을 반올림하고 양식 요소에서 항목을 선택하여 모델에 넣습니까? 나는 그것이 어떻게 작동하는지 혼란 스럽다. 그리고 가장 중요한 것은 어떻게 모델을 저장합니까?
도움이 될만한 링크 또는 도움을 받으실 수 있습니다! 미리 감사드립니다!
당신이 말하는 "모델"나는 사람들은 당신이 당신의 데이터베이스에서 쿼리 및 뷰에 전달할 엔티티를하는 것 같은데요? –
예, GET 편집에서 데이터베이스를 쿼리하고 조회 한 항목을 모델에 넣은 다음 View (모델)를 반환합니다. – maus
EF 4.1 이상을 사용하고 있습니까? –