0

我正在使用 MVC3、Razor、C#、.NET4、EF5。

我有很多直接编辑域模型的情况,是的,我意识到我应该使用 View Models :) 但是在短期内,我希望我能找到解决问题的方法,因为我得到了 null保存到数据库中,其中这些字段未在表单中指定为隐藏字段。我意识到这与模型绑定行为有关。

我的编辑操作:

    public ActionResult Edit(int id)
    {
        StdOrg myOrg = db.StdOrg.Single(s => s.Id == id);
        return View(myOrg);
    }

假设我的视图上有 5 个字段:

Name
Address1
Address2
Address3
Address4

现在我的帖子编辑操作:

 [HttpPost]
 public ActionResult Edit(StdOrg myOrg)
 {
 if (ModelState.IsValid)
   {
     db.StdOrg.Attach(myOrg);
     db.ObjectStateManager.ChangeObjectState(myOrg, EntityState.Modified);
     db.SaveChanges();
     return RedirectToAction("Index");
   }
 return View(myOrg);
 }

现在我的表记录中有 10 列,第 6-10 列有值。

Name
Address1
Address2
Address3
Address4
Terms
EmployeeNo
Code
Active
SetUpDate

当我保存表单时,第 6-10 列即条款等设置为空。现在我意识到这是因为我没有在我的视图中将它们指定为隐藏字段,因此 MVC 模型绑定假设这些为空。

有没有一种实用的方法来解决这个问题,而不是以出于安全原因我不想这样做的形式指定所有列。

提前谢谢了。

编辑

我的尝试似乎不起作用:

    [HttpPost]
    public ActionResult Edit([Bind(Include = "Id,Name,Name,Address1,Address2,Address3,Address4")] StdOrg myOrg)

心想……???

综上所述

对于那些感兴趣的人,我最终使用了“Value Injector”,这是另一个“Automapper”,我为它编写了一个简单的匹配例程来防止设置空值,同时也排除导航属性。非常有用的映射器。

仍然确实需要实现 ViewModel,因为它们似乎是识别视图中的哪些类属性的唯一方法,除非可以让 Bind 属性工作,而我不能。否则,即使使用映射器,也无法将 View 字段重置为 null,因为映射器将确保它被忽略!据我所知,它无法区分视图属性和域类中的其他属性。

4

2 回答 2

1

尝试使用BindAttribute,您可以简单地排除或包含该特定操作的字段(这始终是一种很好的做法,有人可以操纵 POST 上的 ID 字段并修改不同的值)。

请参阅此问题以获取示例

于 2013-08-10T16:41:49.860 回答
0

尽管放了排除的东西:

[Bind(Exclude = "PropertyName,PropertyType")]
public class Filter {

    public string PropertyName { get; set; }
    public Type PropertyType { get; set; }
    public string From { get; set; }
    public string To { get; set; }
    public string Match { get; set; }
}

当我从模型中调用此方法时,这些属性似乎被 NULL 覆盖(注意:PropertyName 和 PropertyType 不是也不能出现在标记中!它们在代码中填充一次,然后再进行标记)

[HttpPost]
public virtual PartialViewResult LoadFiltered(string entityType, IDictionary<string, Filter> filters)

当没有选择任何元素时(界面中所有过滤器都被禁用) - 我得到两个元素,以“控制器”和“动作”作为键。什么……??

于 2015-08-30T22:43:21.697 回答