为什么编辑屏幕会显示我正在编辑的值,但是当我尝试保存时,编辑HTTPPOST有一个空对象?
得到一个错误我已经追踪但没有看到原因。我有一个用于下拉列表的类,因此它只有AdvisoryTypeID和AdvisoryType。但现在我正在为用户创建屏幕,以便在网格中查看所有内容(索引),添加新内容(创建)以及更改现有内容(编辑)。索引屏幕从DB读取没问题。编辑也是如此。创建不需要。
但是Edit和Create在HTTPPOST上都给出了相同的错误。错误是“价值'我输入的任何内容都是无效的”。调试代码出现了原因:“advisoryTypes”变量由于我不理解的原因而为null:
CONTROLLER(编辑帖子)
[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);
}
查看
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,这解决了这个bug)。我手动创建了模型。当我尝试通过向导创建Controller时,向导发出错误“无法检索ProjectName.Models.AdvisoryProviders的元数据”。无法输入类型'System.Data.Entity.Core.Objects.ObjectContext'的对象来键入'System.Data.Objects.ObjectContext'。“
结果是必须通过复制/粘贴另一个并进行更改来手动创建控制器,然后以相同的方式创建我的视图。我怀疑这是相关的,但也许不是。如果这证明不相关,我会删除这个并发布另一个问题。
答案 0 :(得分:0)
来自EF的错误“无法检索ProjectName.Models.AdvisoryProviders的元数据我之前见过,但这只是因为我使用MySQL,这是我发现这种错误的唯一方法,并确保一切work是使用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似乎比使用MVC 4内置的TT模板更好地处理了这个问题
希望这会有所帮助
答案 1 :(得分:0)
我不确定为什么会这样解决,但这就是我所做的。我需要在我的应用程序中为三个不同的东西(类型,提供者,类别)创建上面提到的屏幕(索引与网格,创建,编辑)。我做了第一个,输入,导致了上述问题。
我决定通过从“类型”屏幕复制和粘贴控制器和视图,然后根据需要更改模型和字段名称,期望屏幕具有相同的错误,为“提供者”创建相同的内容。但屏幕都有效。我为“类别”再做了一次,这也很有效。然后我删除了“类型”的失败的创建和编辑屏幕,并从“提供者”屏幕重新创建它们。他们工作了。
我没有解释。