1

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

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

但是 Edit 和 Create 在 HTTPPOST 上都给出了相同的错误。错误是“值'无论我输入什么'都是无效的”。调试代码出现了原因:“advisoryTypes”变量为空,原因我不明白:

控制器(用于编辑帖子)

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

我将此与另一个可以很好地编辑和创建的屏幕进行了比较,它们是相同的(例如,字段名称除外)。我难住了。

模型

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

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

控制器(用于编辑获取)

[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,这解决了那个错误)。我手动创建了模型。当我尝试通过向导创建控制器时,向导给出了错误“无法检索 ProjectName.Models.AdvisoryProviders 的元数据”。无法将类型为“System.Data.Entity.Core.Objects.ObjectContext”的对象转换为类型'System.Data.Objects.ObjectContext'。”。

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

4

2 回答 2

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 发布了这些问题,它真的很痛苦,MVSCaffolding 似乎比使用 MVC 4 的内置 TT 模板更好地处理这种痛苦

希望这可以帮助

于 2013-03-30T00:31:37.863 回答
0

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

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

我没有解释。

于 2013-04-01T12:00:24.780 回答