我有一个名为Search.cshtml的部分视图,我在/ Home / Index中显示。在这个文件中,我有一个HTML表单,用搜索结果搜索并回读/ Views / Accounts / Index。我想在搜索视图中的模态弹出窗口中显示这些结果。
当我点击下面代码中的搜索(sumbit输入)时,我得到一个空模态。
对于MVC,我仍然是新手。我尝试了一些我在Stack Overflow上找到的不同结果,但是我找不到分辨率。下面的代码至少给了我一个模态弹出窗口,虽然它是空白的。
我错过了一些非常简单的东西吗?我已经尝试了下面的模态体中的所有内容(Html.Action,RenderAction,Partial,RenderPartial),似乎没有任何效果。另外,我在那里咆哮着错误的树吗?
我有几张截图和下面的代码。
/Home/Index with Search partial view
Search.cshtml
@model CustomerRelationshipManager.Models.Search
@{ViewBag.Title = "Search";}
@using (Html.BeginForm("Index", "Accounts", new { id = "searchForm" }))
{
<div style="border: solid 1px #ccc; padding: 30px 0 30px 30px; border-radius: 5px;
width: 325px; margin: auto; display: table;">
<table>
<tr>
<td valign="top">
Search By:
</td>
<td>
@Html.DropDownList("Search_Type", "Search_Type")
</td>
</tr>
<tr>
<td valign="top"></td>
<td>
@Html.TextBox("Search_String")
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" data-toggle="modal" data-target="#myModal" value="Search" />
</td>
</tr>
</table>
</div>
<div class="modal fade" id="myModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title">Modal title</h4>
</div>
<div class="modal-body">
@{Html.Action("Index","Accounts");}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
}
HomeController.cs
public ActionResult Search()
{
List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem() { Text = "Account Number", Value = "Account_ID" });
items.Add(new SelectListItem() { Text = "Last Name", Value = "Last_Name" });
items.Add(new SelectListItem() { Text = "Phone Number", Value = "Phone_Number" });
ViewBag.Search_Type = items;
return PartialView();
}
[HttpPost]
[AllowAnonymous]
public ActionResult Search(Search search)
{
return PartialView("~/Accounts/Index");
//return RedirectToAction("Index", "Accounts");
}
AccountController.cs(我想从这个Controller调用Index())
public ActionResult Index(string Search_Type, string Search_String)
{
if (Search_String == null)
{
var accounts = db.Accounts
.Include(a => a.Account_Type)
.Include(a => a.Account_Person)
.Include(a => a.Account_Address)
.Include(a => a.Account_Contact);
return PartialView(accounts.ToList());
}
else
{
if (Search_Type == "Account_ID")
{
var accounts = db.Accounts
.Include(a => a.Account_Type)
.Include(a => a.Account_Person)
.Include(a => a.Account_Address)
.Include(a => a.Account_Contact)
.Where(a => a.Account_ID.ToString() == Search_String);
return PartialView(accounts.ToList());
}
else if (Search_Type == "Last_Name")
{
var accounts = db.Accounts
.Include(a => a.Account_Type)
.Include(a => a.Account_Person)
.Where(b => b.Account_Person.Any(c => c.Person.Last_Name.StartsWith(Search_String)))
.Include(a => a.Account_Contact)
.Include(a => a.Account_Address);
return PartialView(accounts.ToList());
}
else if (Search_Type == "Phone_Number")
{
var accounts = db.Accounts
.Include(a => a.Account_Type)
.Include(a => a.Account_Person)
.Include(a => a.Account_Contact)
.Where(b => b.Account_Contact.Any(c => c.Contact.Value == Search_String && c.Contact.Contact_Type.Name.Contains("Phone")))
.Include(a => a.Account_Address);
return PartialView(accounts.ToList());
}
else
{
var accounts = db.Accounts
.Include(a => a.Account_Type)
.Include(a => a.Account_Person)
.Include(a => a.Account_Address)
.Include(a => a.Account_Contact);
return PartialView(accounts.ToList());
}
}
帐户Index.cshtml(我想在模态弹出窗口中显示)
@model IEnumerable<CustomerRelationshipManager.Models.Account>
@{
ViewBag.Title = "Home";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>Account #</th>
<th>Contact Name(s)</th>
<th>Address</th>
<th>Contact</th>
</tr>
w2
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Account_ID)
<span> </span>
</td>
<td>
@foreach (var i in item.Account_Person)
{
<span>
<b>@Html.DisplayFor(x => i.Person_Type.Name)</b>
<br />
@Html.DisplayFor(x => i.Person.First_Name)
@Html.DisplayFor(x => i.Person.Last_Name)
</span>
<br />
}
</td>
<td>
@foreach (var i in item.Account_Address)
{
<span>
<b>@Html.DisplayFor(x => i.Address_Type.Name)</b>
<br />
@Html.DisplayFor(x => i.Address.Address1)
<br />
@Html.DisplayFor(x => i.Address.Address2)
@if (i.Address.Address2 != null)
{ <br />}
@Html.DisplayFor(x => i.Address.City)
@Html.DisplayFor(x => i.Address.State)
@Html.DisplayFor(x => i.Address.Postal_Code)
<br />
@Html.DisplayFor(x => i.Address.Country)
<br />
</span>
}
</td>
<td>
@foreach (var i in item.Account_Contact)
{
<span>
<b>@Html.DisplayFor(x => i.Contact.Contact_Type.Name)</b>
<br />
@Html.DisplayFor(x => i.Contact.Value)
<br />
</span>
}
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.Account_ID }) |
@Html.ActionLink("Details", "Details", new { id = item.Account_ID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.Account_ID })
</td>
</tr>
}
答案 0 :(得分:2)
使用您当前的代码,当用户点击提交按钮时,它会执行正常的表单提交,因为您的提交按钮位于return text.lower() in name.lower()
标记内。对于您的用例,您应该使用javascript劫持正常形式的form
事件,并对您的操作方法进行ajax调用,在该方法中,它将使用submit
和search_type
参数来获取已过滤数据并返回部分视图结果。此部分视图结果是您要在模式对话框中显示的HTML标记。一旦你的ajax调用收到服务器的响应,用这个响应更新模态对话框的主体内容并激活模态对话框。
search_string
现在有一些javascript代码,它会在您的搜索表单上监听提交事件并停止正常行为(正常表单提交),而是执行ajax表单提交。
@using (Html.BeginForm("Index", "Accounts", FormMethod.Post, new { id = "searchForm" }))
{
<div>
<input type="text" name="Search_String" />
<input type="submit" id="submit" value="Search" />
</div>
}
<div class="modal fade" id="myModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close"
data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">Modal title</h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
现在你必须确保你的Index操作方法返回一个局部视图(这样它就不会执行任何布局代码,只会执行那个视图代码)。
$(document).ready(function () {
$('#searchForm').submit(function (e) {
e.preventDefault();
var $form = $(this);
$.post($form.attr("action"), $form.serialize()).done(function (res) {
$mymodal = $("#myModal");
//update the modal's body with the response received
$mymodal.find("div.modal-body").html(res);
// Show the modal
$mymodal.modal("show");
});
});
});
答案 1 :(得分:0)
我明白了!
我将模式移到了Search.cshtml中的HTML.BeginForm之外。然后,我简化了表单上的输入并删除了数据切换和数据目标属性。
@model CustomerRelationshipManager.Models.Search
@{
ViewBag.Title = "Search";
}
@using (Html.BeginForm("Index", "Accounts", FormMethod.Post, new { id = "searchForm" }))
{
<div style="border: solid 1px #ccc; padding: 30px 0 30px 30px; border-radius: 5px;
width: 325px; margin: auto; display: table;">
<table>
<tr>
<td valign="top">
Search By:
</td>
<td>
@Html.DropDownList("Search_Type", "Search_Type")
</td>
</tr>
<tr>
<td valign="top"></td>
<td>
@Html.TextBox("Search_String")
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" id="submit" value="Search" />
</td>
</tr>
</table>
</div>
}
<div class="modal fade" id="myModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title">Modal</h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
我将javascript移到了_layout.cshtml共享文件的底部。
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
<script type="text/javascript">
$(document).ready(function () {
$('#searchForm').submit(function (e) {
e.preventDefault();
var $form = $(this);
$.post($form.attr("action"), $form.serialize()).done(function (res) {
$mymodal = $("#myModal");
//update the modal's body with the response received
$mymodal.find("div.modal-body").html(res);
// Show the modal
$mymodal.modal("show");
});
});
});
在搞清楚后,我发现了一个LINQ错误,我通过在AccountsController的Index()函数中设置了一个断点。一旦我修复了它,我的AccountController中的Index()动作出现在我的模态弹出窗口中。
HomeController Search() Modal Dialog Displaying AccountsController Index()
谢谢你的帮助,Shyju!