【问题标题】:MVC3 view not updating using EF 4.1MVC3 视图未使用 EF 4.1 更新
【发布时间】:2011-10-05 22:03:17
【问题描述】:

我在更新记录时遇到问题。出于某种原因,它甚至没有点击控制器中的 post 操作,只是返回: "已添加具有相同密钥的项目。"

它的行为好像是在执行插入而不是更新。我会很感激对此有新的看法。这可能是我错过的非常简单的事情。

控制器:

// GET: /Manage/Regions/Edit/5

    public ActionResult Edit(int id)
    {
        Region_CU regionEdit = (from r in db.Venues_Regions
                                where r.RegionsID == id
                                select new Region_CU
                                {
                                        RegionsID = r.RegionsID,
                                        Name = r.Name,
                                        CalendarLink = r.CalendarLink,
                                        MapIcon = r.MapIcon,
                                        QtrStart = r.QtrStart,
                                        QtrEnd = r.QtrEnd,
                                        FacebookLikeBox = r.FacebookLikeBox,
                                        FacebookId = r.FacebookId
                                    //  region = r 
                                }).Single();
        return View(regionEdit);
    }

    //
    // POST: /Manage/Regions/Edit/5

    [HttpPost]
    public ActionResult Edit(Region_CU r)
    {
        if (ModelState.IsValid)
        {
            var v = db.Venues_Regions.First(i => i.RegionsID == r.RegionsID);
                //v.RegionsID = r.RegionsID;
                v.Name = r.Name;
                v.CalendarLink = r.CalendarLink;
                v.MapIcon = r.MapIcon;
                v.QtrStart = r.QtrStart;
                v.QtrEnd = r.QtrEnd;
                v.FacebookLikeBox = r.FacebookLikeBox;
                v.FacebookId = r.FacebookId;
            //Venues_Regions v = new Venues_Regions
            //{
            //    RegionsID = r.RegionsID,
            //    Name = r.Name,
            //    CalendarLink = r.CalendarLink,
            //    MapIcon = r.MapIcon,
            //    QtrStart = r.QtrStart,
            //    QtrEnd = r.QtrEnd,
            //    FacebookLikeBox = r.FacebookLikeBox,
            //    FacebookId = r.FacebookId
            //};
            //db.Venues_Regions.Attach(v);
            //db.ObjectStateManager.ChangeObjectState(v, EntityState.Modified);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(r);
    }

查看:

@model THPT_Razor.Areas.Manage.Models.Region_CU

@{
ViewBag.Title = "Edit Region";
}

<h2>Edit</h2>
<link href="@Url.Content("~/Content/themes/base/jquery.ui.all.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">   </script>
<script>
   $(document).ready(function () { $('.date').datepicker({ dateFormat: "mm/dd/yy"   });    });
</script>
@using (Html.BeginForm()) {
  @* @Html.ValidationSummary(true)*@
<fieldset>
    <legend>@Html.DisplayFor(model => model.Name)</legend>

    @Html.HiddenFor(model => model.RegionsID)
    @Html.HiddenFor(model => model.Name)
    @Html.HiddenFor(model => model.CalendarLink)
    <div class="editor-label">
        @Html.Label("Map Icon")
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.MapIcon, new SelectList(Model.mapicons,"id","Description"))
    </div>
    <div class="editor-label">
        @Html.Label("Quarter Start")
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.QtrStart, new { @class = "date" })
        @Html.ValidationMessageFor(model => model.QtrStart)
    </div>

    <div class="editor-label">
        @Html.Label("Quarter End")
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.QtrEnd, new { @class = "date" })
        @Html.ValidationMessageFor(model => model.QtrEnd)
    </div>

    <div class="editor-label">
        @Html.Label("Region Facebook ID")
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.FacebookId)
        @Html.ValidationMessageFor(model => model.FacebookId)
    </div>
    <div class="editor-label">
       @Html.Label("Region Facebook LikeBox Code")
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.FacebookLikeBox)
        @Html.ValidationMessageFor(model => model.FacebookLikeBox)
    </div>
    <p>
        <input type="submit" value="Update" />
    </p>
</fieldset>

编辑:

我收到了一些很好的建议,但我想我还不清楚。 Region_CU 不是实体。 Venues_Regions 是我要更新的内容。请参阅下面课程中的 cmets 进行说明。最初的目标是构建一个简单的包装器,其中包含 Venues_Regions 对象和地图图标的列表对象。但是,字段 likebox 的数据注释没有被传递,导致 Venues_Regions 对象被破坏。现在,当我尝试保存更新时,它甚至没有点击 http post 操作。我希望这能澄清我想要完成的工作并寻求帮助。再次感谢所有帮助和快速响应。

//create and update
public class Region_CU
{

    public Region_CU()
    {

    }
    public List<MapIcon> mapicons { get; set; }
    //public Venues_Regions region { get; set; }

    // The fields below are what makes up Veunes_Region
    // this was broken out from the above Venues_Region 
    // because the UIHint was not being passed through
    public int RegionsID { get; set; }
    public string Name { get; set; }
    public string CalendarLink { get; set; }
    public int MapIcon { get; set; }
    public DateTime? QtrStart { get; set; }
    public DateTime? QtrEnd { get; set; }

    [UIHint("tinymce_jquery_full"), AllowHtml]
    public string FacebookLikeBox { get; set; }
    public string FacebookId { get; set; }
    public string mapIcon { get; set; }

}

编辑#2: 经过一夜好眠后,解决方案出现了。在更新操作中,我需要做的就是从传入的包装器更改为传入的 Venues_Region 对象,现在一切正常。

感谢所有帮助和建议。

提前感谢您的帮助, 克里斯

【问题讨论】:

  • 您是否考虑过迁移到 EF 4.1?它的 DbContext API 使您可以更轻松地更新您需要的任何内容。

标签: asp.net-mvc-3 entity-framework-4 razor


【解决方案1】:

实际上,您需要做的就是加载场地并调用 TryUpdateModel。你甚至不需要传入对象。然后保存场地。另一种方法是使用自动映射器在对象之间复制字段或使用前面提到的附加方法,但无论哪种方式都不需要手动复制字段。

【讨论】:

  • 感谢亚当的建议。但是,问题是我将包装器传递回了更新操作,而不是导致我所有困惑的对象。我使用了 attach 方法并看到了 UpdateModel 和 TryUpdateModel 的示例,但是自动映射器是什么?
  • Automapper 在 codeplex 上,通常在 MVC 中用于将字段从一个对象复制到另一个基于匹配属性名称的对象。看看,两行代码复制所有props就不错了。
猜你喜欢
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多