我正在学习学习asp mvc模式,并且在控制器上有点丢失。我正在构建的网页需要在左侧搜索“面板”,在右侧搜索数据窗口。
这是一个或两个控制器的任务吗?我需要的是用户在搜索面板上输入数据,单击go然后在该面板中显示结果。
在一个控制器下看起来很简单,但是......
我想点击搜索面板中的一个结果并在右侧面板中显示他们的数据,但这是新控制器的作业吗?看起来两个控制器直观地控制每个面板但是甚至可能吗?
答案 0 :(得分:1)
您的搜索面板和输出(结果)面板似乎都在搜索“上下文”中。由同一个控制器处理它们是完全可以接受的。
当人们开始使用MVC时,他们会为每个实体提供一个控制器。这是在CRUD环境中学习MVC的好建议,但在移动实体CRUD时可能会引起一些混乱。
在你的情况下使用SearchController。
答案 1 :(得分:1)
您所描述的内容可以通过多种方式实现,但听起来有点像您正在考虑像页面一样的“控制器”。控制器包含多个方法,每个方法都将执行一个动作(可能是一个页面渲染)。控制器不代表网页,而是执行的一系列动作(重定向,GET,POSTS等)。
我想点击搜索面板中的一个结果并在右侧面板中显示他们的数据,但这是新控制器的作业吗?看起来两个控制器直观地控制着每个面板但是甚至可能吗?
您可能只有一个控制器,但搜索的Get和Post阶段有两种方法。如何填充每个面板会带来很多问题:
也许最容易开始的是第一个选项 - 强制搜索页面刷新。
public class MyController : Controller
{
// GET
public ActionResult Index()
{
return View();
}
// POST
[HttpPost]
public ActionResult Index(string searchWord)
{
// Perform whatever steps involved in finding things
IEnumerable<MyResults> results = _service.Search(searchWord);
// Pass the result into the view
return View(results);
}
}
然后快速简单的观点:
@model IEnumerable<MyResults>
<div id="panel_1">
@using(Html.BeginForm())
{
<input type="text" name="searchWord" />
<button type="submit">Go</button>
}
</div>
<div id="panel_2">
@if(Model != null)
{
<ul>
@foreach(var result in Model)
{
<li>@result.Name</li>
}
</ul>
}
</div>
从这里开始,使用Ajax进行连接非常简单。
编辑 - 第2步 - ajax内容。
控制器操作不必返回整个视图 - 它们可以返回部分到ajax请求。
因此,至少为面板2添加一个部分:
Index.cshtml:
@*
Panel 1 remains the same. Or could move it do it's own partial and
render it via Html.RenderPartial("Panel1")
*@
<div id="panel_1">
@using(Html.BeginForm())
{
<input type="text" name="searchWord" />
<button type="submit">Go</button>
}
</div>
@* This is now just a placeholder since it will be populated via ajax. *@
<div id="panel_2"></div>
创建一个新视图Panel2.cshtml
@model IEnumerable<MyResults>
@if(Model != null)
{
<ul>
@foreach(var result in Model)
{
<li>@result.Name</li>
}
</ul>
}
else
{
<i>Nothing found</i>
}
然后更改控制器操作:
// POST
[HttpPost]
public ActionResult Index(string searchWord)
{
// Perform whatever steps involved in finding things
IEnumerable<MyResults> results = _service.Search(searchWord);
// Pass the result into the partial view for panel 2
return View("Panel2", results);
}
唯一的左边是一些javascript将它们全部链接在一起(不能完全做到这一点)
$(document).ready(function() {
$('#panel_1 form').submit(function() {
$.post({
url: this.action,
success: function(response) {
// Replace the contents in panel 2
$('#panel_2).html(response);
}
});
});
});