Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 具有可编辑和只读数据的MVC ViewModel最佳实践_Asp.net Mvc 4_Asp.net Mvc Viewmodel - Fatal编程技术网

Asp.net mvc 4 具有可编辑和只读数据的MVC 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; } } 我的观点:

我想知道在同一个viewModel中处理可编辑/只读字段的最佳实践是什么。 对于更大的ViewModel,我面临这个问题,但假设我有一个非常简单的ViewModel:

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)