Asp.net mvc 4 MVC4:是否将子部分视图值发送到控制器?
首先,我必须说,我是MVC4新手,开发此应用程序并同时学习MVC4: 在这个应用程序中, 下面是父视图,其中渲染了3个局部视图,还有一个按钮:Asp.net mvc 4 MVC4:是否将子部分视图值发送到控制器?,asp.net-mvc-4,partial-views,Asp.net Mvc 4,Partial Views,首先,我必须说,我是MVC4新手,开发此应用程序并同时学习MVC4: 在这个应用程序中, 下面是父视图,其中渲染了3个局部视图,还有一个按钮: [code] <td id="track">@Html.Partial("_Track",Model)</td><br> <td id="tech"> <div id="Technologies"> @Html.Partial("_Technology",Model) </div>
[code]
<td id="track">@Html.Partial("_Track",Model)</td><br>
<td id="tech">
<div id="Technologies"> @Html.Partial("_Technology",Model)
</div></td></tr>
..
[some code]
..
<td class="subtopic">
<div class="subtopiclist" id="subque">@Html.Partial("_Subtopics",Model)</div><br>
<input type="Submit" value="Fetch Interview Questions" name="Fetch" id="Fetch" />
</td>
局部视图1它包含下拉列表:
@model MvcApplication3.Models.CommonWrapper
@using (Ajax.BeginForm("SelectTrack", "Home", new AjaxOptions { UpdateTargetId = "Technologies" }))
{
@Html.DropDownListFor(
m=>m.SelectedTrackId,
new SelectList(Model.track, "TrackId", "TrackName"),
string.Empty
)
}
<script type="text/javascript">
$('#SelectedTrackId').change(function () {
$(this).parents('form').submit();
});
</script>
Parital View2它包含下拉列表:
@model MvcApplication3.Models.CommonWrapper
@if (Model.tech != null && Model.tech.Count() > 0)
{
using (Ajax.BeginForm("SelectTechnology", "Home", new AjaxOptions { UpdateTargetId = "subque" }))
{
@Html.HiddenFor(m => m.SelectedTrackId)
@Html.DropDownListFor(
m => m.SelectedTechId,
new SelectList(Model.tech, "TechId", "TechName"),
string.Empty
)
}
}
<script type="text/javascript">
$(document).on('change', '#SelectedTechId', function () {
$(this).parents('form').submit();
});
</script>
局部视图3它包含多个复选框:
@if (Model.subtopic != null && Model.subtopic.Count() > 0)
{
<table>
@for (int i = 0; i < Model.subtopic.Count; i++)
{
<tr><td>
@Html.CheckBoxFor(m => m.subtopic[i].IsSelected, new { id = "subTopic_" + i })
@Html.HiddenFor(m => m.subtopic[i].SubtopicName)
@Html.DisplayFor(m => m.subtopic[i].SubtopicName)
<td>
</tr>
}
</table>
}
现在在父视图中,我想从这三个部分视图中获取值。另外,我需要将这些获取的值发送给控制器。
如何做到这一点?谁能帮我一下吗。
提前谢谢
添加控制器代码:
[HttpPost]
public ActionResult SelectTrack(int? selectedTrackId)
{
CommonWrapper wrapper = new CommonWrapper();
wrapper.tech = new List<TechModel>();
if (selectedTrackId.HasValue)
{
wrapper.tech = (from s in CommonWrapper.GetTechnology()
where s.TrackId == selectedTrackId
orderby s.TechName
select s).ToList();
}
return PartialView("_Technology", wrapper);
}
[HttpPost]
public ActionResult SelectTechnology(int? selectedTechId)
{
CommonWrapper wrapper = new CommonWrapper();
wrapper.subtopic = new List<SubtopicsModel>();
if (selectedTechId.HasValue)
{
wrapper.subtopic = (from s in CommonWrapper.GetSubtopics()
where s.TechId == selectedTechId
orderby s.SubtopicName
select s).ToList();
}
return PartialView("_Subtopics", wrapper);
}
我将创建一个ViewModel并将其放入[HttpPost]控制器操作中 希望这有帮助
Christian尝试将ajax表单更改为仅使用jquery发布到所需的控制器操作。然后,这会将局部视图从需要更新目标中分离出来 您可以对调用不同控制器操作的每个下拉列表应用此方法 删除Ajax.BeginForm和相应的jquery代码,并用以下代码替换它们 父视图
这些都不是魔法,只是有些模糊。从简单地查看页面的输出HTML开始,您将看到表单和输入是如何构造的,就像一个带有许多字段的普通表单一样。一个问题是,当您可能希望父视图中有一个表单时,您正在局部视图上嵌套表单。当您为数组正确使用索引时,它的大部分将绑定到接收的模型。请显示您的控制器代码。嗨,TrueBlueAusie,我添加了控制器代码。如果您能分享一些虚拟代码片段,这将非常有帮助。非常感谢您的帮助David。我尝试使用第一种方法,它对我有效:
<script type="text/javascript">
$(function ()
{
$("#SelectedTrackId").change(function ()
{
var selectedValue = $(this).val();
$.ajax(
{
type: "post",
data: selectedValue,
url: url,
success: function (data)
{
// data contains your partial view
$("#some-container-id").html(data);
}
});
});
});
</script>