c# - 我的 ViewModel 流程正确吗?如何将其发送回控制器并在控制器操作上刷新它?
问题描述
我的 ViewModel 流程正确吗?' SubObjectViewModel ' 类的使用是一个坏习惯还是一个好习惯?或者我应该尝试其他选项,比如只为这个类创建一个 ViewModel?
而且,我应该如何将 ViewModel ' ObjectViewModel '及其所有值返回给控制器,更改它们并从页面视图刷新值?
我的视图模型
Public class ObjectViewModel{
public string name { get; set; }
public int value { get; set; }
public bool IsCameraPermited { get; set; }
public List<SubObjectViewModel> choosenSubObjects{ get; set; } // need to get it back on controller;
public class SubObjectViewModel
{
public int IdObject { get; set; }
public string Name { get; set; }
public string Config { get; set; }
}
public List<Object> listSub{ get; set; } //list that will be filled on 'Create' Controller
}
我的控制器
public IActionResult Create(int id)
{
List<Object> listSubObject = new List<Object>();
listSubObject = _getAllSubObjectsDAO.ListByID(id);
List<Object> choosenObjects= new List<Object>();
choosenObjects = _getChoosenObjectsDAO.ListByID(id);
List<SubObjectViewModel> listSubObject = new List<SubObjectViewModel>();
foreach (Object item in choosenObjects )
{
string config = _configurationDAO.GetConfigurationById(item.configId);
ObjectViewModel .SubObjectViewModel SubObject = new ObjectViewModel .SubObjectViewModel { IdObject = item.Id, Name = item.Name , Config = config };
listSubObject.Add(setorVM);
}
ObjectViewModel objVM = ObjectViewModel{
name ="test",
value = 2,
IsCameraPermited =true,
listSub = listSubObject,
choosenSubObjects = listSubObject
};
return View(objVM);
}
我的观点
@model Project.Models.ViewModels.ObjectViewModel
... more code
<form asp-action="Create">
<div class="row">
<div class="col-sm-6 ctnFullHeight">
<div class="shadowBoxForm formCreateLeft position-absolute col-sm-11 ctnFullHeight">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<input asp-for="name " class="form-control" />
<span asp-validation-for="name " class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="IsCameraPermited" class="control-label"></label>
<input asp-for="IsCameraPermited" type="checkbox" />
</div>
<div class="form-group float-right position-relative">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
<div class="col-sm-6">
<div class="shadowBoxForm formCreateLeft position-absolute col-sm-11 ">
@foreach (var item in listSub)
{
<div class="txt">
@item
</div>
}
</div>
</div>
</div>
</form>
提前致谢。
解决方案
我应该如何将 ViewModel 'ObjectViewModel' 及其所有值返回给控制器
要实现上述要求,您可以参考以下代码片段。
@model ObjectViewModel
@{
ViewData["Title"] = "Create";
var choosenSubObjects = Model.choosenSubObjects;
}
<form method="post">
<div class="row">
<div class="col-sm-6 ctnFullHeight">
<div class="shadowBoxForm formCreateLeft position-absolute col-sm-11 ctnFullHeight">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<input asp-for="name " class="form-control" />
<span asp-validation-for="name " class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="IsCameraPermited" class="control-label"></label>
<input asp-for="IsCameraPermited" type="checkbox" />
</div>
<div class="form-group float-right position-relative">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
<div class="col-sm-6">
<div class="shadowBoxForm formCreateLeft position-absolute col-sm-11 ">
@for (var i = 0; i < Model.choosenSubObjects.Count; i++)
{
<div class="txt">
<div class="form-group">
<label asp-for="@choosenSubObjects[i].IdObject" class="control-label"></label>
<input asp-for="@choosenSubObjects[i].IdObject" type="text" />
</div>
<div class="form-group">
<label asp-for="@choosenSubObjects[i].Name" class="control-label"></label>
<input asp-for="@choosenSubObjects[i].Name" type="text" />
</div>
<div class="form-group">
<label asp-for="@choosenSubObjects[i].Config" class="control-label"></label>
<input asp-for="@choosenSubObjects[i].Config" type="text" />
</div>
</div>
}
</div>
</div>
</div>
</form>
控制器动作
[HttpGet]
public IActionResult Create(int id)
{
//code logic here
//...
return View(objVM);
}
[HttpPost]
public IActionResult Create(ObjectViewModel objectViewModel)
{
//code logic here
//...
测试结果
推荐阅读
- react-native - react-native run-android 错误
- ios - 关于没有`removeObserver:forKeyPath:`的iOS10和iOS11中KVO的不同行为
- google-sheets - 匹配不同工作表上的两列,并使用公式将一些列回发到第三张工作表
- javascript - 如何在 Javascript/JQuery 或 AngularJS 中清除浏览器缓存
- php - 如何正确获取每个参与者的姓名和自定义问题的答案,以便可以在 DB 中引入所有信息?
- c# - 使用背景颜色突出显示 pdf 文件中的文本
- laravel - Laravel 5.5 APK 文件上传问题
- sql - 更新抛出错误消息子查询返回超过 1 个值
- go - 解组在根级别没有键的元组
- c++ - 使用 swscale 进行图像合成