我在主视图中有部分内容,这个部分视图会在" Click Me"单击按钮。现在我的问题是,如何将局部视图模型绑定回主模型?
这是我的父视图
@model TestModel
@using (Html.BeginForm("TestAction", "GetQuote", FormMethod.Post, new { @class = "loader-disabled-next", role = "form", id = "frmtest" }))
{
<fieldset class="fieldset-border loader" >
<legend class="fieldset-border fieldset-header">Find Your locations</legend>
<div>
@Html @Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
</div>
<button type="button" id="click">Click Me!</button>
</fieldset>
<fieldset class="fieldset-border loader" >
<legend class="fieldset-border fieldset-header">YOUR BUSINESS LOCATION(S)</legend>
<div id="BusinessLocations">
<div class="col-xs-12">
@Html.Partial("_BusinessLocationResults", Model.Addresses)
</div>
</div>
</fieldset>
}
this is how the partial code looks like
@model IEnumerable<BusinessAddress>
@foreach (var item in Model)
{
<div class="col-xs-12 col-md-3 col">
<fieldset class="fieldset-border loader">
<p class="funnel-your-business">
<span id="address-address1">
@item.Address1
</span>
<br />
<span id="address-citystate">
@({item.State}")
</span>
</p>
</fieldset>
</div>
}
这是我的viewmodel定义 查看模型
public class TestModel
{
public string FirstName {get;set;}
public string List<BusinessAddress> Addresses {get;set;}
}
public class BusinessAddress
{
public string Address1 {get;set;}
public string State {get;set;}
}
Public ActionResult LoadData()
{
var model = new TestModel();
model.FirstName = "sssss";
model.Addresses = new List<BusinessAddress>();
return view("TestBusiness",model);
}
以下是返回部分视图数据的操作方法
public PartialViewResult SaveClickMe(string firstname)
{
var model = new List<BusinessAddress>();
//logic to create and populate list of Business address
//model has data at this point
return PartialView("partialaddview",model);
}
答案 0 :(得分:0)
当您将数据发布到服务器(我的意思是action
中的controller
)时,您可以将其绑定到class
。如果您要将数据发送回View
,您只需从Action
(Controller
发送数据。
这样的事情:
public ActionResult TestAction(TestModel input)
{
// some code/validation
// return the same view but with the TestModel you bind from view to a view again!
return View(input);
}
您的Partial View
只会呈现,但您没有从那里发送信息。您只需添加hidden
输入即可提供信息,并将其绑定为目标属性indexed collection
Addresses
。样本:
@model IEnumerable<BusinessAddress>
@{
int index = 0;
}
@foreach (var item in Model)
{
@Html.Hidden("Addresses[" + index + "].Address1", item.Address1)
@Html.Hidden("Addresses[" + index + "].State", item.State)
index++;
<div class="col-xs-12 col-md-3 col">
<fieldset class="fieldset-border loader">
<p class="funnel-your-business">
<span id="address-address1">
@item.Address1
</span>
<br />
<span id="address-citystate">
@({item.State}")
</span>
</p>
</fieldset>
</div>
}
答案 1 :(得分:0)
我建议在这种情况下,因为您正在寻找轻松的双向绑定,所以使用EditorFor
。
@Html.EditorFor(m => m.Addresses, "BusinessLocationResults")
然后将简单的部分放在~/Views/Shared/EditorTemplates/BusinessLocationResults.cshtml
内或~/Views/Home/EditorTemplates/BusinessLocationResults.cshtml
内,其中Home
是控制器的名称
Razor引擎将查找并找到与“item”类的名称匹配的视图。如果是这样,它将遍历集合,为您的地址中的每个项生成一行可枚举。这意味着您现在将删除部分代码中的循环。
作为副作用和您正在寻找的真正好处,它还以这样的方式命名控件,即集合可以以默认模型绑定器理解的方式发布到控制器。