不确定我是否清楚地理解了这个问题。我在处理部分视图时也遇到了很多麻烦(发布数据,如果发布操作中发生错误,则将它们加载回来......)。
如果加载索引时这里有一些参数,您似乎想填充局部视图。
在 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 调用相同的方式使用局部视图。
如果您需要从局部视图发布数据,我在一些事情上遇到了很多困难:
- 局部视图中需要 FormContext
@if (this.ViewContext.FormContext == null)
{
this.ViewContext.FormContext = new FormContext();
}
- 如果您允许多次推送局部视图并发布它们,则在控制器发布操作中创建自定义 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; }
- 如果使用 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");
}
});
当我第一次处理所有这些局部视图的事情时,几乎所有我能想到的事情都困扰着我。希望这里能对你有所帮助。