实际上,在浏览器端看情况时,不存在“部分视图”或“父视图”的说法。浏览器只看到一个HTML文档。尤其是PartialViews,它们只在服务器端有意义,并且确实帮助你。它使您能够在多个页面上重复使用部分视图,并在一个地方修改所有内容。当Razor渲染此cshtml文件时,从上到下开始渲染,遇到@Html.Partial("something")时,执行返回HTML编码字符串的方法并显示返回的字符串。最后,Razor返回一个完整的HTML页面。因此,当您从HTML提交数据时,唯一重要的是哪个输入类型具有哪个名称属性。
解决方案1:无需Ajax
根据您的主视图,您的获取方法如下。
public ActionResult MainView()
{
var _itemDetail = new ItemDetails { ID = 1, Name = "Item1" };
var pvm = new ProductionViewModel();
pvm.CurrentItemDetails = _itemDetail;
return View(pvm);
}
我假设您已经有了表单标签,只需将按钮类型更改为提交。
@using(Html.BeginForm()){
<div class="row">
<div class="col-md-12">
@Html.Partial("_CurrentData", Model.CurrentItemDetails)
</div>
</div>
<div class="row">
<div class="col-md-2 col-md-offset-5">
<div>
<input type="submit" class="btn btn-primary" value="Submit" id="btnSubmit" />
<input type="button" class="btn btn-primary" value="Cancel" id="btnCancel" />
<br /><br />
</div>
</div>
</div>
}
并将您的帖子操作添加到控制器中,这是完全没有问题的。
[HttpPost]
public ActionResult MainView(ItemDetails submittedItem)
{
var pvm = new ProductionViewModel();
pvm.CurrentItemDetails = submittedItem;
return View(pvm);
}
这将返回带有新项目的相同视图。
解决方案2:Ajax使用jQuery
此解决方案已经给出。您将有两个选项:从服务器返回部分视图并用返回的内容替换旧内容,或者返回JSON并通过DOM操作更改内容。这两种方法都有缺点。
Sippy的答案很完美,我想要补充的是,与其使用jQuery Ajax方法,使用load方法更合理,以返回静态视图。
$("#partialViewDiv").load('@Url.Content("~/Controller/_CurrentData")');
解决方案3:使用双向数据绑定或类似Angular的框架
当您想要刷新部分视图时,您可能需要一些额外的信息,例如新创建的项的ID。这就是为什么您需要与服务器通信,因为您已经在运行中拥有了新的输入值。也许您想在同一页的某个位置显示所有保存的项目,并在从服务器返回创建的项目后手动添加它。因此,如果您的页面需要这种情况,最好使用像Angular这样的框架。这样,您可以轻松刷新部分视图并进行许多操作。我的演示仅用于演示,您可以遵循许多设计原则。
这是主视图
<div ng-app="ItemApp" ng-controller="ItemController">
<form name="newTopicForm" data-ng-submit="save()">
<div class="row">
<div class="col-md-12">
@Html.Partial("_CurrentData", Model.CurrentItemDetails)
</div>
</div>
<div class="row">
<div class="col-md-2 col-md-offset-5">
<div>
<input type="submit" class="btn btn-primary" value="Submit" id="btnSubmit" />
<input type="button" class="btn btn-primary" value="Cancel" id="btnCancel" />
<br /><br />
</div>
</div>
</div>
</form>
</div>
局部视图
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Editor</h3>
</div>
<div class="panel-body">
<div class="row form-group">
<div class="col-sm-4 control-label text-right">
<strong>Name:</strong>
</div>
<div class="col-sm-8 control-label">
@Html.TextBoxFor(m => m.Name, new { @class = "formcontrol",data_ng_model="item.name",data_ng_init="item.name="+"'"+@Model.Name+"'"})
</div>
</div>
</div>
</div>
文本框通过ng-model属性绑定到item.name,所以我们不需要担心刷新视图。当item.name发生变化时,视图也会随之改变。(双向数据绑定)
包含angular js和自定义js代码。
var myApp = angular.module('ItemApp', []);
myApp.controller('ItemController', function ($scope, $http,$q) {
$scope.itemList = {};
$scope.save = function () {
$http.post("mainview", $scope.item).
then(function (result) {
$scope.item.name = result.data.Name;
itemList.splice(0, 0, result.data);
},
function () {
console.log(error);
});
};
});
还有服务器端代码
[HttpPost]
public ActionResult MainView(ItemDetails SubmittedItem)
{
SubmittedItem.ID = 1;
return Json(SubmittedItem);
}
使用Angular时,您只需要处理对象,所有视图操作都通过双向数据绑定完成。