在ViewModelBuilder

时间:2017-07-10 12:45:48

标签: c# asp.net-core asp.net-core-viewcomponent

我希望在其各自的控制器视图模型构建器中保持视图模型的构建(此处称为vmb)。以HomeController为例,我将从其构造函数HomeViewModelBuilder进行实例化。

public class HomeController : Controller
{
    private readonly HomeViewModelBuilder _viewModelBuilder;

    public HomeController(IUserManagerService userManagerService, IEmployeeService employeeService, IExampleServiceZ exampleServiceZ)
    {
       _viewModelBuilder = new HomeViewModelBuilder(userManagerService, employeeService, exampleServiceZ);
    }

    public ActionResult Index()
    {
        var model = _viewModelBuilder.BuildHomeViewModel(CurrentUserId);
        return View("Index", model);
    }
}

对于这个vmb的构造函数,传递从repo中提取数据所需的任何服务。

由于.Net Core没有带来儿童行为,我需要决定如何继续移植asp.net mvc5应用程序。一些子动作视图调用自己的子动作。这不是关于嵌套视图组件的问题,而是如何使用视图组件,请记住我想在构建器中构建。目前我们正在使用像这样的jquery肮脏的黑客:

视图上将容纳子操作的容器

<div id="subsections-container">
    @*This is a place holder for the $.get*@
</div>

在视图的底部是脚本:

@section scripts{

    <script type="text/javascript">
        $(function () {
            $(document).ready(function() {
                var fieldsUrl = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Url.Action("Index", "SubSection")));

                $.get(fieldsUrl, { sectionId: @Model.Section.Id }, function (data) {
                    $("#subsections-container").html(data);
                });
            });
        });

    </script>
}

我想开始使用视图组件,但http://www.davepaquette.com/archive/2016/01/02/goodbye-child-actions-hello-view-components.aspx

给出了示例

包含在这里

namespace MyWebApplication.ViewComponents
{
    public class WhatsNewViewComponent : ViewComponent
    {
        private readonly IArticleService _articleService;

        public WhatsNewViewComponent(IArticleService articleService)
        {
            _articleService = articleService;
        }

        public IViewComponentResult Invoke(int numberOfItems)
        {
            var articles = _articleService.GetNewArticles(numberOfItems);
            return View(articles);
        }
    }
}

他正在构建该视图组件的调用内部。我想在vmb中做到这一点。

第二个问题是我有一个想要刷新该容器中数据的ajax表单。

视图中的表格:

@using (@Ajax.BeginForm("Update", "SubSection", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "subsections-container", OnBegin = "blockModal()", OnComplete = "hideModal();" }, new { id = "frm-subsection-update", @class = "form-horizontal" }))
{
}

分段控制器中的操作

[HttpPost]
[Authorize(Roles = RoleName.SubSectionUpdate)]
public ActionResult Update(SubsectionUpdateViewModel model)
{
    var subsection = new SubsectionDto();

    if (model.Id > 0)
        subsection = _subsectionService.Get(model.Id);

    subsection.InjectFrom(model);
    _subsectionService.Update(subsection);

    return RedirectToAction("Index", new { });
}

如果这不再是一个动作而是一个视图组件,我该在这里返回什么?

1 个答案:

答案 0 :(得分:1)

  

他正在构建该视图组件的调用内部。我想在vmb中做到这一点。

WhatsNewViewComponentViewModel中添加HomeViewModel属性,并负责将WhatsNewViewComponentViewModel创建为HomeViewModelBuilder

Index.cshtml Home控制器

@await Component.InvokeAsync("WhatsNew",Model.WhatsNewViewComponentViewModel)

WhatsNewViewComponent

public class WhatsNewViewComponent : ViewComponent
{  
    public IViewComponentResult Invoke(WhatsNewViewComponentViewModel model)
    {
        return View(model);
    }
}
  

如果这不再是一个动作而是一个视图组件,我该在这里返回什么?

从Action

返回ViewComponent
[HttpPost]
[Authorize(Roles = RoleName.SubSectionUpdate)]
public ActionResult Update(SubsectionUpdateViewModel model)
{
    .......
    return ViewComponent("VCName", VCModel);
}