Asp.net mvc 4 具有可编辑和只读数据的MVC ViewModel最佳实践
我想知道在同一个viewModel中处理可编辑/只读字段的最佳实践是什么。 对于更大的ViewModel,我面临这个问题,但假设我有一个非常简单的ViewModel:Asp.net mvc 4 具有可编辑和只读数据的MVC ViewModel最佳实践,asp.net-mvc-4,asp.net-mvc-viewmodel,Asp.net Mvc 4,Asp.net Mvc Viewmodel,我想知道在同一个viewModel中处理可编辑/只读字段的最佳实践是什么。 对于更大的ViewModel,我面临这个问题,但假设我有一个非常简单的ViewModel: public class BaseListViewModel { public int Id { get; set; } public bool IsCheckedForAction { get; set; } public string DisplayName { get; set; } } 我的观点:
public class BaseListViewModel
{
public int Id { get; set; }
public bool IsCheckedForAction { get; set; }
public string DisplayName { get; set; }
}
我的观点:
@model Wims.Website.ViewModels.Shared.BaseModelListViewModel
@using Wims.Website.Classes.Helpers.ExtentionMethods
<div class="dataDetail">
<div>
<div class="float-left">
@Html.CheckBoxFor(model => model.IsCheckedForAction)
</div>
<div class="float-left">
@Html.LabelFor(model => model.IsCheckedForAction, Model.DisplayName)
@Html.GenerateSecureDataControls(w => w.Id)
</div>
</div>
</div>
<div style="clear: both"></div>
我知道有几种方法可以解决这个问题:
1) 加
在视图中,如果只有1个字段就可以了,但是,如果有10个仅显示字段,会发生什么呢
2) 如果[HttpPost]中的(!Model.isValid),则重新查询数据
3) 我想我可以把它缓存在TempData中
最好的方法是什么?
谢谢
编辑:我试图避免在验证失败时必须重新查询数据我会使用该模式。由于您仅在GET操作中构建ViewModel,因此更加枯燥。如果验证失败,则重定向以获取并从tempdata中获取模型状态
本文中或MVC Contrib中的属性使POST和GET之间传递Modelstate变得容易。POST操作应执行与GET操作相同的viewmodel初始化。您可以将初始化代码移动到控制器中的公共专用函数中。原因是,如果由于对相同数据的某些并发更改而导致验证失败,则验证错误将与新数据一起显示给用户。如果视图允许,您也可以使用PRG模式。您好,谢谢您的回答,我不明白这些帖子如何帮助我保持ViewModel数据的完整性?我知道我可以保留modelState错误以将它们发送到另一个操作。我的问题更多的是关于在我的ViewModel中填充未列出的数据?为什么?在“获取”操作中创建一次ViewModel。将从[RestoreModelStateFromTempData]恢复属性放在GET上。将[SetTempDataModelState]放到帖子上。然后,如果ModelState验证失败,则重定向回GET。它将生成一个新的ViewModel,然后再次合并到提交的数据和验证错误中,感谢您没有放弃我:)我想我理解您的意思,但我试图避免的是在第二次获取时再次返回数据库(是的,我没有提到)。我所能做的,也许是建议(如果对速度慢感到抱歉的话:)按照您刚才写的做,在第一次获取后在TempData中添加完整的ViewModel,然后在PRG模式中从TempData中获取它?再次感谢。如果您想避免再次访问数据库,则需要将其置于tempdata。应更新问题以反映db要求。基本上类似的想法,但合并在仅显示字段中。一定是一个昂贵的数据库调用!查看缓存db查询结果不是更好吗?我尝试只从TempData获取数据而不过滤任何内容,在一个简单的测试中,它起了作用,只读数据返回,可编辑数据设置为编辑值。这根本不是一个昂贵的电话(几个小电话),但我相信如果不是为了优化而需要的话,最好避免。谢谢你的帮助!
[HttpPost]
public ActionResult Edit(BaseListViewModel stuff)
{
if (ModelState.IsValid)
{
...
return View("Index");
}
return View(stuff);
}
@Html.HiddenFor(model => model.DisplayName)