是否可以使用一个.net ASP MVC控制器用于两个“面板”

时间:2012-01-24 21:58:12

标签: asp.net-mvc model-view-controller

我正在学习学习asp mvc模式,并且在控制器上有点丢失。我正在构建的网页需要在左侧搜索“面板”,在右侧搜索数据窗口。

这是一个或两个控制器的任务吗?我需要的是用户在搜索面板上输入数据,单击go然后在该面板中显示结果。

在一个控制器下看起来很简单,但是......

我想点击搜索面板中的一个结果并在右侧面板中显示他们的数据,但这是新控制器的作业吗?看起来两个控制器直观地控制每个面板但是甚至可能吗?

2 个答案:

答案 0 :(得分:1)

您的搜索面板和输出(结果)面板似乎都在搜索“上下文”中。由同一个控制器处理它们是完全可以接受的。

当人们开始使用MVC时,他们会为每个实体提供一个控制器。这是在CRUD环境中学习MVC的好建议,但在移动实体CRUD时可能会引起一些混乱。

在你的情况下使用SearchController。

答案 1 :(得分:1)

您所描述的内容可以通过多种方式实现,但听起来有点像您正在考虑像页面一样的“控制器”。控制器包含多个方法,每个方法都将执行一个动作(可能是一个页面渲染)。控制器不代表网页,而是执行的一系列动作(重定向,GET,POSTS等)。

  

我想点击搜索面板中的一个结果并在右侧面板中显示他们的数据,但这是新控制器的作业吗?看起来两个控制器直观地控制着每个面板但是甚至可能吗?

  1. 不,这可能不是新控制器的工作。
  2. 是的,但可能不是你想要的。
  3. 您可能只有一个控制器,但搜索的Get和Post阶段有两种方法。如何填充每个面板会带来很多问题:

    • 您会在搜索时强制刷新页面吗?
    • Ajax重装?
    • 天堂禁止,框架?
    • Javascript面板?

    也许最容易开始的是第一个选项 - 强制搜索页面刷新。

    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);
                }
            });
        });
    });