我的 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 和文件?

如何从服务中访问我的活动的 ViewModel?

Mvvm:如何更新我的ObservableCollection 从另一个ViewModel?

WPF 中的 MVVM - 如何提醒 ViewModel 模型中的变化......或者我应该吗?