.NET MVC - 自定义编辑表单

时间:2014-07-10 20:39:37

标签: c# asp.net-mvc

编辑v2: - 解决步骤

写了自定义的ModelBinder,现在它可以工作了。另外,我尝试并注意到,如果将布尔值作为字符串(“boolean.toString()”)解析为隐藏输入,它将与Default ModelBinder一起使用。 但是使用Deafault ModelBinder,我不会抓住这个。


编辑v1:

我可能已经开始添加其余字段的隐藏输入。现在它似乎没有正确地将表单值与模型绑定...

根据我对Default Binder的理解,当我得到的所有字段名称与表单输入名称属性相同时(int season ....

我可能需要编写自己的活页夹,但是我非常期待的那种模型优雅会不在话下。

到目前为止,对我来说可能还有更好的解决方案。任何建议和帮助表示赞赏。


ORIGINAL:

有关于创建的问题,并且能够构建我自己的编辑操作,我将仅更改少数属性(在本例中为季节和剧集字段),我希望它能够与模型一起使用,而不是单个字段

我有这个型号......

public class Entry
{
    public int entryID { get; set; }

    [Required]
    [Range(0, 99)]
    public int season { get; set; }

    [Required]
    [Range(0, 99)]
    public int episode { get; set; }

    [Required]
    public Boolean button_dark { get; set; }

    [Required]
    public int showID { get; set; }
    public virtual Show show { get; set; }

    public int? pictureID { get; set; }
    public virtual Picture picture { get; set; }

    public Entry () {
        season = 0;
        episode = 0;
    }
}

...我在控制器中获得了经典的GET和POST动作......

    public ActionResult Index(int id)
    {
        Entry entry = db.Entries.Find(id);
        if (entry == null)
        {
            return HttpNotFound();
        }
        return View(entry);
    }

    [HttpPost]
    public ActionResult Index(Entry entry)
    {
        if (ModelState.IsValid)
        {
            db.Entry(entry).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Home");
        }
        return View(entry);
    }

......在视图中我很重要。

    <form action="/Entry/Index/@Model.entryID" method="post">
         <input type="number" name="season" value="@Model.season" />
         <input type="number" name="episode" value="@Model.episode"/>
         <input class="button" type="submit" value="Submit" />
    </form>

从我读到的关于Model Binder的内容来看,它只是嚼得好。 (我希望我没有错过解释或误解任何事情) 提交表单时,我在“db.SaveChanges();”中获得此异常。言。

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException未被用户代码处理   的HResult = -2146233087   Message =存储更新,插入或删除语句影响了意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。

我知道它说的是什么,但不知道为什么。作为.NET MVC中的新手,我不了解其他论坛帖子中的异常本身。

是否有人请知道我应该在哪里做什么或者读什么来帮助我?

非常感谢。

1 个答案:

答案 0 :(得分:0)

好的,现在我将总结一下,对我来说,对我的问题有点不直观,解决方案......

  1. 您需要在表单中包含所有模型字段(即使它们是 隐藏)
  2. 确保在输入值中插入正确的数据类型, 否则,粘合剂不会成功地将数据绑定到模型(for 例如:布尔值必须以String)的形式出现