【问题标题】:Loading a partial view dynamically and loading index from controller动态加载局部视图并从控制器加载索引
【发布时间】:2020-09-22 15:29:56
【问题描述】:

我不知道如何做到这一点。我已经尝试了所有我能想到的搜索。任何帮助/指导将不胜感激。

客户希望能够从所见即所得的编辑器动态加载局部视图。因此,我在控制器中创建了一个方法,用于搜索获取局部视图名称的特殊标记。让它工作正常。现在,客户想要从局部视图加载和发布数据。

我能够通过这样做来加载它 - finalhtml += PartialView("~/Views/Global/Partials/" + commandContents + ".cshtml").RenderPartialViewToString();

如果我将控制器命名为部分视图加上控制器的确切名称,即:SamplePartialController,我可以将视图发布回控制器,但我不知道如何在部分视图上加载初始索引方法不管我怎么尝试。

如果我能以编程方式定义初始索引方法和控制器名称,那就太好了,只是看不到方法。

我对 mvc 相当陌生,从事 asp.net 已有十多年了,这可能很明显,但我只是没有找到方法。谢谢!

【问题讨论】:

    标签: c# model-view-controller


    【解决方案1】:

    不确定我是否清楚地理解了这个问题。我在处理部分视图时也遇到了很多麻烦(发布数据,如果发布操作中发生错误,则将它们加载回来......)。

    如果加载索引时这里有一些参数,您似乎想填充局部视图。

    在 Controller.Index(或获取参数的位置)中,您可以分配一些 ViewModel 值,或使用 ViewBag/ViewData。

    在索引视图中,您可以根据之前设置的参数在需要的地方调用 RenderPartialAsync()

    this.ViewData["error"] = Model.Error;
    this.ViewData["partialGuid"] = Guid.NewGuid();
    this.ViewData["foo"] = bar;
    
    await Html.RenderPartialAsync("_PartialViewName", Model.PartialViewModel, this.ViewData);
    

    并以与 ajax 调用相同的方式使用局部视图。

    如果您需要从局部视图发布数据,我在一些事情上遇到了很多困难:

    1. 局部视图中需要 FormContext
    @if (this.ViewContext.FormContext == null)
    {
        this.ViewContext.FormContext = new FormContext();
    }
    
    1. 如果您允许多次推送局部视图并发布它们,则在控制器发布操作中创建自定义 collectionId 会有很大帮助
    @{
        var collectionId = $"PartialItems[{this.ViewData["partialGuid"]}].{{0}}";
    }
    
    // then later...
    
    <input class="form-control"
            data-val="true"
            data-val-required="@(string.Format(ApplicationResources.Error_Required, ApplicationResources.FieldFirstName))"
            id="@(string.Format(collectionId, "FirstName"))"
            name="@(string.Format(collectionId, "FirstName"))"
            type="text"
            value="@(string.IsNullOrWhiteSpace(Model.FirstName) ? string.Empty : Model.FirstName)" />
    <span class="field-validation-valid text-danger"
            data-valmsg-for="@(string.Format(collectionId, "FirstName"))"
            data-valmsg-replace="true"></span>
    
    // And in your Index ViewModel, something like that to get the collection in the controller post action
    
    public IDictionary<string, PartialViewModel> PartialItems { get; set; }
    
    1. 如果使用 Ajax 调用新的局部视图,在第一次渲染视图后,如果需要,重置 jquery 验证器
    $.ajax({
        // ...
        success: function (res) {
    
            // do your stuff
            $('#parentId').prepend(res);
    
            // reinit the validation
            $("form").each(function () { $.data($(this)[0], 'validator', false); });
            $.validator.unobtrusive.parse("form");
        }
    });
    

    当我第一次处理所有这些局部视图的事情时,几乎所有我能想到的事情都困扰着我。希望这里能对你有所帮助。

    【讨论】:

    • 感谢您提供非常详细的答案。当我回到我的车站时,我会通过它并让你知道。归结起来,我基本上是在寻找像 Asp.net 用户控件中的页面加载事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多