【问题标题】:Delete value by updating field通过更新字段删除值
【发布时间】:2014-11-15 05:46:04
【问题描述】:

我有这个:

查看:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Bycicle</h4>
        <hr />
        @Html.ValidationSummary(true)
        @Html.HiddenFor(model => model.id)

        <div class="form-group">
            <label class="control-label col-md-2" for="BycicleID">Mark</label>
            <div class="col-md-10">
                @Html.DropDownList("BycicleID", String.Empty)
                @Html.ValidationMessageFor(model => model.id)
            </div>
        </div>

控制器:

public async Task<ActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Bycicle bycicle = await db.Bycicles.FindAsync(id);
            if (bycicle == null)
            {
                return HttpNotFound();
            }
            ViewBag.id = new SelectList(db.Bycicles, "BycicleID", "Mark", bycicle.id);
            //ViewBag.Color = new SelectList(db.Bycicles, "Color", "Color", bycicle.Color);
            //ViewBag.Weight = new SelectList(db.Bycicles, "Weight", "Weight", bycicle.Weight);
            //ViewBag.Height = new SelectList(db.Bycicles, "Height", "Height", bycicle.Height);
            return View(bycicle);
        }

        // POST: Bycicle/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Edit(
           [Bind(Include = "id, Mark, Color, Weight,Height")] 
       Bycicle bycicle)
        {

            if (ModelState.IsValid )
            {
                db.Entry(bycicle).State = EntityState.Modified;
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }


            ViewBag.id = new SelectList(db.Bycicles, "id", "Mark", bycicle.id);


            return View(bycicle);
        }

和模型:

public class Bycicle
    {
        public int id { get; set; }
        // [Column("Mark")]
        public string Mark { get; set; }
        public string Color { get; set; }
        public string Weight { get; set; }
        public string Height { get; set; }
        public DateTime? LastTimeChecked { get; set; }


    }

但是我可以更新其他值(颜色、重量、高度)但是如果我在更新视图中按保存,标记名称将被删除。我还检查了数据库,更新后标记值消失了。但是如果我只是按下编辑(更新)然后首先我在下拉列表中看到值(标记),但保存后标记值消失了。即使我没有更改更新视图中的标记值。

我就是不知道哪里出了问题。

谢谢!!

好吧,

我确实知道这是一个类型错误,

但是,dropdonlists 不正确是什么意思?因为您没有无限的自行车标记列表。这就是为什么我选择制作一个包含所有标记、颜色和尺寸的下拉列表的原因。因为管理员填写标记、尺寸等,然后用户可以选择标记、颜色等。但是您将如何设计不同的属性?

我没有单独的颜色、标记等表格。但有必要吗?

谢谢

【问题讨论】:

  • 因此,如果尚未创建 Bycicle,则 new SelectList(db.Bycicles, "Color", "Color", bycicle.Color); 将为空 - 即您永远无法选择颜色。当然,对于与Bycicle 具有外键关系的颜色,您需要单独的表格

标签: asp.net-mvc-4 visual-studio-2012 c#-5.0


【解决方案1】:

您没有将任何内容绑定到属性Mark(您显示的内容绑定到了ID 属性)。最好选择列表的名称不应与您的属性相同。

在控制器中

ViewBag.MarkList = new SelectList(db.Bycicles, "BycicleID", "Mark");

在视图中

@model YourAssembly.Bycicle
....
<div class="form-group">
  @Html.LabelFor(m => m.Mark)
  <div class="col-md-10">
    @Html.DropDownListFor(m => m.Mark, (SelectList)ViewBag.MarkList)
    @Html.ValidationMessageFor(m => m.Mark)
  </div>
</div>

注意,由于绑定了所有属性,所以不需要[Bind(Include = "id, Mark, Color, Weight,Height")]

编辑

虽然通过ViewBag 传递值有效,但我建议您使用视图模型和强类型帮助器,以便您获得智能感知支持以及使用视图模型的所有其他好处。

public class BycicleVM
{
  public int id { get; set; }
  // other properties of Bycicle that you want to edit
  public SelectList MarkList { get; set; }
  // other select lists
}

然后将选择列表分配给视图模型而不是 ViewBag

【讨论】:

  • 请注意,我认为您的选择列表没有意义,因为您将它们全部绑定到db.Bycicles。您有BycicleMarksBycicleColours 等的表格吗?
  • 您已尝试编辑我的答案,该答案将被拒绝(添加 cmets 或改为编辑您的问题)。注意我的更新(拼写错误ViewBag.MakeList 应该是ViewBag.MarkList
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2022-01-27
相关资源
最近更新 更多