值“”无效

时间:2013-03-29 16:40:40

标签: entity-framework asp.net-mvc-4 poco

为什么编辑屏幕会显示我正在编辑的值,但是当我尝试保存时,编辑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'。“

结果是必须通过复制/粘贴另一个并进行更改来手动创建控制器,然后以相同的方式创建我的视图。我怀疑这是相关的,但也许不是。如果这证明不相关,我会删除这个并发布另一个问题。

2 个答案:

答案 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)

我不确定为什么会这样解决,但这就是我所做的。我需要在我的应用程序中为三个不同的东西(类型,提供者,类别)创建上面提到的屏幕(索引与网格,创建,编辑)。我做了第一个,输入,导致了上述问题。

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

我没有解释。