c# - 将数据从局部视图传递到父视图
问题描述
我有一个带有来自https://postcodes.io的邮政编码查找功能的个人资料页面。到目前为止,我有一个使用以下代码的 Ajax 表单的部分视图。
@using (Ajax.BeginForm("_CityLookUp", "Home", new AjaxOptions
{
HttpMethod = "POST",
UpdateTargetId = "div1",
InsertionMode = InsertionMode.Replace
}))
{
<div id="div1">
<div class="form-group">
@Html.LabelFor(m => m.PostCode, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.PostCode, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-10">
@Html.HiddenFor(m => m.County, new { @class = "form-control", id = "County" })
</div>
</div>
<div class="form-group">
<div class="col-md-10">
@Html.HiddenFor(m => m.City, new { @class = "form-control", id = "City" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-primary" value="Look Up" />
</div>
</div>
</div>
}
这行得通。然后,我使用主配置文件表单在主配置文件页面上呈现部分页面。
我只想将其他两个隐藏字段的值分配给主页中的字段。
部分控制器
[HttpGet]
public PartialViewResult _CityLookUp()
{
return PartialView();
}
[HttpPost]
public PartialViewResult _CityLookUp(string postcode)
{
var client = new PostcodesIOClient();
var result = client.Lookup(postcode);
var jst = new AddressLookupViewModel();
jst.City = result.AdminDistrict;
jst.County = result.AdminCounty;
jst.PostCode = postcode;
ViewBag.City = jst.City;
ViewBag.County = jst.County;
var results = new BooksViewModel();
results.City = jst.City;
results.County = jst.County;
return PartialView(jst);
}
我尝试了一个新的视图模型并将结果分配给视图模型,但它不起作用。尝试使用 JavaScript 获取隐藏字段的值,没有运气。如果您更愿意使用单独的方法,请说明您将如何实现它。
父视图
@model TestingView.Models.ParentViewModel
<div class="container">
@Html.Partial("_CityLookUp")
<div class="form-group">
<div class="col-md-10">
@Html.TextBoxFor(v => v.City, new { @class = "form-control", id = "City" })
</div>
</div>
</div>
部分视图模型
namespace TestingView.Models
{
public class AddressLookupViewModel
{
public string PostCode { get; set; }
public string County { get; set; }
public string City { get; set; }
}
}
父视图模型
namespace TestingView.Models
{
public class ParentViewModel
{
public string City { get; set; }
public string County { get; set; }
}
}
附带问题:出于某种原因,当我将鼠标悬停在
@Html.HiddenFor(m => m.City, new { @class = "form-control", id = "City" })
在父视图上,它引用父视图中的 AddressLookUpViewModel 而不是 BooksViewModel。我添加了两个视图模型。
解决方案
我将以两种方式回答;首先使用您最初询问的方法,然后我希望如何实现它。
解决方案 1
使用这种方法,我们会将 City 元素的值从局部视图复制到父视图。
我们需要修复的第一件事是,当您现在查看配置文件时,将有两个元素的 Id 为“City”;一份来自父页面,一份来自部分页面。那是无效的标记,它会给任何潜在的解决方案带来问题。
重命名父视图中的 Id 属性:
@Html.TextBoxFor(v => v.City, new { @class = "form-control", id = "Profile_City" })
更新部分视图以在成功检索一组邮政编码值时调用 js 函数:
@using (Ajax.BeginForm("_CityLookUp", "Home", new AjaxOptions
{
HttpMethod = "POST",
UpdateTargetId = "div1",
InsertionMode = InsertionMode.Replace,
OnSuccess = "UpdateProfile" // Add this
}))
在父视图末尾添加一个js函数UpdateProfile:
@section scripts {
<script>
function UpdateProfile()
{
var City = $("#City").val();
alert(City);
$("#Profile_City").val(City);
}
</script>
}
这应该是所有需要的。警报只是用于调试。
代码将@section scripts
被注入到_Layout.cshtml
它调用的地方@RenderSection("scripts", required: false)
,这是默认 MVC 项目的一部分。
未来可能会出现的一个问题是,当您将父视图构建到一个视图中时,form
您可能出于布局原因想要嵌套表单元素,但不允许嵌套表单元素。
推荐阅读
- python - 通过 pytorch 中的视图将索引转换回来
- typescript - 打字稿 - 空检查后对象可能是'null'.ts(2531)
- node.js - MongoDB 在插入之前检查对象属性,否则创建新对象
- oracle - ef core db-migraions 在表空间中创建表
- python - 如何在数据框的每一列中查找特定字符串的 value_count
- reactjs - 如何根据另一个数字输入中的数字动态创建多个字段?
- pytorch - 记录 jit 编译的 PyTorch 类方法 (Sphinx)
- math - 了解 Gram-Schmidt Process 是如何翻译成这段代码作为实现的
- java - Hackerrank:内部类Solution.Result中的非法静态声明
- python - 从 python 字典中删除值