我将要描述的问题与我已经找到的问题非常相似(例如this post with nearly identical name),但我希望我可以把它变成不重复的东西。
我在Visual Studio中创建了一个新的ASP.NET MVC 5应用程序。然后,我定义了两个模型类:
public class SearchCriterionModel
{
public string Keyword { get; set; }
}
public class SearchResultModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
然后我按如下方式创建了SearchController
:
public class SearchController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult DisplaySearchResults()
{
var model = new List<SearchResultModel>
{
new SearchResultModel { Id=1, FirstName="Peter", Surname="Pan" },
new SearchResultModel { Id=2, FirstName="Jane", Surname="Doe" }
};
return PartialView("SearchResults", model);
}
}
以及观看Index.cshtml
(强烈输入SearchCriterionModel
作为模型和模板编辑)和SearchResults.cshtml
作为部分使用IEnumerable<SearchResultModel>
类型的模型查看(模板列表)。
这是索引视图:
@model WebApplication1.Models.SearchCriterionModel
@{
ViewBag.Title = "Index";
}
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>SearchCriterionModel</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Keyword, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Keyword, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Keyword, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="button" id="btnDisplaySearchResults" value="Search" onclick="location.href='@Url.Action("DisplaySearchResults", "SearchController")'" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
<div id="searchResults">
</div>
如您所见,我在标准模板下方添加了div
id="searchResults"
并编辑了按钮。我想要的是在底部的SearchResults.cshtml
中显示部分视图div
,但仅在单击按钮后显示。我已成功使用@Html.Partial("SearchResults", ViewBag.MyData)
在那里显示局部视图,但是在第一次加载父视图并且我已经在ViewBag.MyData
方法中设置Index()
时,它会被渲染,不是我想要的。
摘要:单击按钮,我将获得一些List
SearchResultModel
个实例(通过数据库访问),然后应使用此新获取的数据作为模型呈现局部视图。 我怎样才能做到这一点?我在第一步似乎已经失败了,就是用上面的代码点击按钮做出反应。现在,我导航到URL ~/Search/DisplaySearchResults
,但当然没有任何内容,也没有调用代码隐藏方法。
在传统的ASP.NET中,我只是添加了一个服务器端OnClick
处理程序,为网格设置DataSource
并显示网格。但是在MVC中我已经失败了这个简单的任务......
更新:将按钮更改为@Html.ActionLink
我最终可以输入控制器方法。但自然因为它返回局部视图,它显示为整个页面内容。所以问题是:我如何告诉部分视图在客户端的特定div
内呈现?
答案 0 :(得分:54)
将按钮更改为
<button id="search">Search</button>
并添加以下脚本
var url = '@Url.Action("DisplaySearchResults", "Search")';
$('#search').click(function() {
var keyWord = $('#Keyword').val();
$('#searchResults').load(url, { searchText: keyWord });
})
并修改控制器方法以接受搜索文本
public ActionResult DisplaySearchResults(string searchText)
{
var model = // build list based on parameter searchText
return PartialView("SearchResults", model);
}
jQuery .load
方法调用您的控制器方法,传递搜索文本的值并使用局部视图更新<div>
的内容。
附注:此处可能不需要使用<form>
代码和@Html.ValidationSummary()
以及@Html.ValidationMessageFor()
。您永远不会返回Index
视图,因此ValidationSummary
没有任何意义,我假设您需要null
搜索文本来返回所有结果,并且在任何情况下您都没有属性的任何验证属性Keyword
因此无需验证。
修改强>
根据OP的评论SearchCriterionModel
将包含多个具有验证属性的属性,然后方法是包含提交按钮并处理表单.submit()
事件
<input type="submit" value="Search" />
var url = '@Url.Action("DisplaySearchResults", "Search")';
$('form').submit(function() {
if (!$(this).valid()) {
return false; // prevent the ajax call if validation errors
}
var form = $(this).serialize();
$('#searchResults').load(url, form);
return false; // prevent the default submit action
})
并且控制器方法将是
public ActionResult DisplaySearchResults(SearchCriterionModel criteria)
{
var model = // build list based on the properties of criteria
return PartialView("SearchResults", model);
}
答案 1 :(得分:0)
这是控制器代码。
public IActionResult AddURLTest()
{
return ViewComponent("AddURL");
}
您可以使用JQuery加载方法加载它。
$(document).ready (function(){
$("#LoadSignIn").click(function(){
$('#UserControl').load("/Home/AddURLTest");
});
});