2013-03-29 26 views
1

为什么编辑屏幕显示我正在编辑的值,但是当我尝试保存时,Edit HTTPPOST有一个空对象?值“”无效

获取我追查到的错误,但没有看到原因。我有一个用于下拉列表的类,所以它只有AdvisoryTypeID和AdvisoryType。但现在我正在为用户创建屏幕来查看网格中的所有内容(索引),添加新的(创建)并更改现有的(编辑)。索引屏幕从数据库中读取没有问题。编辑也是如此。创建不需要。

但是编辑和创建在HTTPPOST上给出相同的错误。错误是“价值”,无论我输入“无效”。调试代码打开了原因:在“advisoryTypes”变量为空的原因,我不明白:

[Authorize] 
[HttpPost] 
public ActionResult Edit(AdvisoryTypes advisoryType) 
{ 
    try 
    { 
     if (ModelState.IsValid) //never get past this because it's null above 
etc.... 
} 

我比较这到另一个屏幕,做编辑和

控制器(编辑后)创建正常,它们是相同的(例如,除了字段名称)。我很难过。

MODEL

public class AdvisoryTypes 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int AdvisoryTypeID { get; set; } 

    [Display(Name = "Type")] 
    [Required] 
    public string AdvisoryType { get; set; } 
} 

CONTROLLER(用于编辑获取)

[Authorize] 
    public ActionResult Edit(int id = 0) 
    { 
     AdvisoryTypes advisoryType = db.AdvisoryType.Find(id); 
     if (advisoryType == null) 
     { 
      return HttpNotFound(); 
     } 

     return View(advisoryType); 
    } 

VIEW

model TheNewSolution.Models.AdvisoryTypes 

@{ 
ViewBag.Title = "Edit Advisory Type"; 
} 

<h2>Edit Advisory Type</h2> 
@*<br />*@ 
@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Advisory</legend> 
    <table> 
     <tr> 
      <td> 
       @Html.HiddenFor(model => model.AdvisoryTypeID) 
       <div class="editor-label"> 
        @Html.LabelFor(model => model.AdvisoryType) 
       </div> 
       <div class="editor-field"> 
        @Html.EditorFor(model => model.AdvisoryType) 
        @Html.ValidationMessageFor(model => model.AdvisoryType) 
       </div> 
      </td> 
     </tr> 
    </table> 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 
} 

<div> 
@Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
@Scripts.Render("~/bundles/jqueryval") 
} 

第二部分 现在有些奇怪的背景:这是第一模型/控制器/视图我将EF从5更新为6 alpha3后创建(不得不因为我在同一个项目中有POCO和edmx)这解决了这个错误)。我手动创建了模型。当我尝试通过向导创建控制器时,向导发出错误“无法检索ProjectName.Models.AdvisoryProviders的元数据”。无法将类型为“System.Data.Entity.Core.Objects.ObjectContext”的对象强制类型化'System.Data.Objects.ObjectContext'。“

结果是必须手动创建控制器,方法是复制/粘贴另一个控件并进行更改,然后以相同的方式创建我的视图。我怀疑这是所有相关但可能不是。如果这证明无关,我会删除这个并作为另一个问题发布。

+0

无法投射类型...您似乎在混合EF6和EF5。不幸的是,这是不可能的。我不认为MVC目前支持EF6。 – Pawel

回答

0

我不知道为什么这个解决,但这是我做的。我需要在我的应用程序中为上述三种不同的事物(类型,提供者,类别)创建上述屏幕(带网格的索引,创建,编辑)。我做了第一个类型,导致了上述问题。

我决定通过从“类型”屏幕复制并粘贴控制器和视图,然后根据需要更改模型和字段名称,期望屏幕具有相同的错误,从而为“提供者”创建相同。但屏幕一切正常。我再次做了“类别”,这也是有效的。然后,我删除了“类型”的失败创建和编辑屏幕,并从“提供者”屏幕重新创建它们。他们工作。

我没有任何解释。

0

来自EF的错误“无法检索我以前见过的ProjectName.Models.AdvisoryProviders的元数据,但这只是因为我使用的是MySQL,这是我发现这种错误的唯一方法,并且要确保一切工作是使用http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d从数据库中创建模型,然后用http://blog.stevensanderson.com/2011/01/13/scaffold-your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/创建控制器,可欣赏,而不是为EF创建视图的越野车版本。

我张贴了关于这些问题的同时,回来EF5和它的一个真正的痛苦,MVCScaffolding似乎处理这种痛苦比内置的TT模板更好的MVC 4

希望这个他lps