asp.net-mvc – ASP.NET MVC 5模型绑定编辑视图
|
我无法想出一个最好用口头和一些代码描述的问题的解决方案.我正在使用VS 2013,MVC 5和EF6代码优先;我还使用MvcControllerWithContext脚手架,它生成一个支持CRUD操作的控制器和视图. 简单地说,我有一个包含CreatedDate值的简单模型: public class WarrantyModel
{
[Key]
public int Id { get; set; }
public string Description { get; set; }
DateTime CreatedDate { get; set; }
DateTime LastModifiedDate { get; set; }
}
包含的MVC脚手架为其索引,创建,删除,详细信息和编辑视图使用相同的模型.我想在’创建’视图中创建CreatedDate;我不希望它在“编辑”视图中,因为我不希望在编辑视图发回服务器时更改其值,并且我不希望任何人在表单发布期间能够篡改该值. 理想情况下,我不希望CreatedDate进入“编辑”视图.我已经在模型的CreatedDate属性上找到了一些属性(例如,[ScaffoldColumn(false)]),这些属性阻止它出现在Edit视图中,但随后我在回发时遇到绑定错误,因为CreatedDate结束了值为1/1/0001 12:00:00 AM.这是因为编辑视图没有将值传回给CreatedDate字段的控制器. 我不想实现需要任何SQL Server更改的解决方案,例如在包含CreatedDate值的表上添加触发器.如果我想进行快速修复,我会在呈现编辑视图之前存储CreatedDate(服务器端),然后在回发时恢复CreatedDate – 这样我就可以更改1/1/0001日期在渲染视图之前从数据库中提取到CreatedDate EF6.这样,我可以将CreatedDate作为隐藏的表单字段发送,然后在回发后覆盖控制器中的值,但我没有一个很好的策略来存储服务器端值(我不想使用Session变量或者ViewBag). 我看着使用[Bind(Exclude =“CreatedDate”)],但这没有帮助. 我的控制器的编辑回发函数中的代码如下所示: public ActionResult Edit([Bind(Include="Id,Description,CreatedDate,LastModifiedDate")] WarrantyModel warrantymodel)
{
if (ModelState.IsValid)
{
db.Entry(warrantymodel).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(warrantymodel);
}
我以为我可能能够检查上面if块中的db.Entry(warrantymodel)对象,并在OriginalValue中检查CreatedDate,但是当我尝试访问该值时(如下所示),我得到了类型’的异常’ System.InvalidOperationException“: var originalCreatedDate = db.Entry(warrantymodel).Property("CreatedDate").OriginalValue;
如果我可以成功检查原始的CreatedDate值(即已经在数据库中的值),我可以覆盖CurrentValue的任何内容.但由于上面的代码行生成异常,我不知道还能做什么. (我考虑过查询数据库中的值,但这很愚蠢,因为在呈现编辑视图之前已经查询了数据库的值). 我的另一个想法是将CreatedDate值的IsModified值更改为false,但是当我调试时,我发现它在前面显示的’if’块中已经设置为false: bool createdDateIsModified = db.Entry(warrantymodel).Property("CreatedDate").IsModified;
我对如何处理这个看似简单的问题缺乏想法.总之,我不想将模型字段传递给Edit视图,并且我希望该视图(在此示例中为CreatedDate)在视图中的其他Edit字段被回发并使用持久化到数据库时保持其原始值db.SaveChanges(). 任何帮助/想法将非常感激. 谢谢. 解决方法您应该利用ViewModels:public class WarrantyModelCreateViewModel
{
public int Id { get; set; }
public string Description { get; set; }
DateTime CreatedDate { get; set; }
DateTime LastModifiedDate { get; set; }
}
public class WarrantyModelEditViewModel
{
public int Id { get; set; }
public string Description { get; set; }
DateTime LastModifiedDate { get; set; }
}
ViewModel的意图与域模型的意图略有不同.它为视图提供了正确呈现所需的足够信息. ViewModels还可以保留与您的域无关的信息.它可以保存对表或搜索过滤器上的排序属性的引用.穿上你的领域模型肯定没有意义! 现在,在控制器中,您将ViewModel中的属性映射到域模型并保留更改: public ActionResult Edit(WarrantyModelEditViewModel vm)
{
if (ModelState.IsValid)
{
var warrant = db.Warranties.Find(vm.Id);
warrant.Description = vm.Description;
warrant.LastModifiedDate = vm.LastModifiedDate;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(warrantymodel);
}
此外,ViewModel非常适合合并来自多个模型的数据.如果您有关于保修的详细信息视图,但您还希望在保修期内完成所有服务,该怎么办?你可以简单地使用像这样的ViewModel: public class WarrantyModelDetailsViewModel
{
public int Id { get; set; }
public string Description { get; set; }
DateTime CreatedDate { get; set; }
DateTime LastModifiedDate { get; set; }
List<Services> Services { get; set; }
}
ViewModels简单,灵活,非常受欢迎.以下是对它们的一个很好的解释:http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/ 你最终会编写很多映射代码. Automapper非常棒,可以完成大部分繁重工作:http://automapper.codeplex.com/ (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 使用区域时,“路由表中没有路由匹配提供的值”
- asp.net-mvc – ASP.NET MVC视图模型命名约定
- Asp.net复选框和html数据属性
- asp.net-mvc – webgrid中的Mvc 3 texbox(razor)
- asp.net – Dotnetopenauth oAuth服务提供商的解释
- asp.net – 如何将标签元素与单选按钮相关联
- 从2.0到3.5的ASP.NET框架效应?
- asp.net-mvc – 覆盖控制器AuthorizeAttribute只有一个操作
- asp.net – 在后面的代码中无法识别嵌套的Repeater
- webforms – ASP.Net Core 1.0是否支持WebForm项目
- asp.net-mvc – MVC不引人注目的范围验证动态值
- asp.net-mvc-4 – MVC4 RC脚本捆绑很慢
- asp.net – 进程服务应用程序池“经典.NET AppPo
- asp.net-mvc – ASP.NET MVC5/IIS Express无法调
- ASP.net MVC AntiForgeryToken over AJAX
- asp.net-mvc – 禁用生产中的Glimpse和glimpse.a
- asp.net – 使用Team City快照依赖项时,您使用快
- asp.net-mvc-3 – 如何修改MVC3视图页面中的body
- webmatrix – ASP.NET页面中的_PageStart.cshtml
- ASP.NET MVC中的基本认证5
