我的 ViewModel 流程正确吗?如何将其发送回控制器并在控制器操作上刷新它?
Posted
技术标签:
【中文标题】我的 ViewModel 流程正确吗?如何将其发送回控制器并在控制器操作上刷新它?【英文标题】:Is my ViewModel flow right? How to send it back to controller and refresh it on a controller action? 【发布时间】:2020-05-02 20:33:12 【问题描述】:我的 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>
提前致谢。
【问题讨论】:
asp-net.core
?然后将.net-core
标记更改为一个 :)
@aepot 我删除了 .net-core 并添加了 asp-net.core,感谢您的帮助!
【参考方案1】:
我应该如何将 ViewModel 'ObjectViewModel' 及其所有值返回给控制器
要达到上述要求,可以参考下面的代码sn-p。
@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
//...
测试结果
【讨论】:
我尝试了您的代码,并且成功了!但是为什么带有索引的'for'起作用,而带有和 的@foreach 不起作用??? 如果您检查渲染输入字段的名称属性和您发布的实际表单数据,您会发现上面的工作代码会在表单数据中附加一些数据,如choosenSubObjects[0].IdObject: 1
,这有助于将数据很好地绑定到choosenSubObjects 属性.
您可以查看this official doc 了解模型绑定的工作原理。
嗨@vinib,如果上述解决方案确实有助于解决问题,您可以accept it as answer。
对不起,但这对问题的主要问题没有帮助。我会支持你的 aswner,但我没有所需的声誉!以上是关于我的 ViewModel 流程正确吗?如何将其发送回控制器并在控制器操作上刷新它?的主要内容,如果未能解决你的问题,请参考以下文章
如何将正确的 viewModel 注入单个 viewController
可以将 ViewModel 传递给 RecyclerView(无 DataBinding)吗?
如何在 MVC 5 中以单个 Ajax POST 请求发送 ViewModel 和文件?