MVC控制器概念

时间:2013-11-10 18:42:05

标签: c# asp.net-mvc

我有Database个对象,每个对象代表磁盘上的文件:

这是我的目标:

public class MyObject
{
    public int id { get; set; }
    public string fileName { get; set; }
    public string browser { get; set; }    
    public string protocol { get; set; }    
    public string family { get; set; }
}

在我的主页面中,我点击按钮,导致带有DropDownList的页面,其中所有文件都按协议属性排序。 这是我的控制器,它返回具有特定family(我的对象属性)的对象集合:

我的控制器:

    public ActionResult Index()
    {
        var list = db.Captures.Where(x => x.family == "Web").ToArray();
        list = list.Distinct(new MyObjectByProtocolComparer())
                   .OrderBy(x => x.fileName)
                   .ToArray();            

        ViewBag.Files = list;
        return View();
    }

我的Index.cshtml显示我的协议列表:

<div>

        @Html.DropDownList("File", new SelectList(ViewBag.Files, "Id", "protocol_site"), "Select webmail site", new { style = "vertical-align:middle;" })
        <button type="button">Select</button>
    </div>

我要添加的内容并且不知道如何从我的DropDownList中选择某个协议文件并按下该按钮后会收到列出具有此特定协议的所有文件。 我阅读了this文章,但我不确定这是否是我想要的,在默认的MVC网页上有删除,创建和详细信息链接,但我想要一些不同的东西,只需添加新按钮,阅读我的DropDownList中的项目名称,并在列表中显示我的数据库结果。 如果熟悉好教程的人我会很高兴学习,我不希望有人会为我做我的工作,这不是我的风格,当然这不会帮助我理解MVC但你需要明白我对Web全新而不是控制台\ winforms这看起来很混乱和不清楚(带有设计和HTML的代码)

2 个答案:

答案 0 :(得分:0)

按钮“选择”需要由html FORM 标记包装,该标记位于MVC .cshtml视图中,可以通过@Html.BeginForm()扩展方法呈现(请参阅帮助)。获得html表单后,您可以通过将此按钮设置为“submit”类型,使用户能够将其发布回Web服务器。当用户推送它时,浏览器会收集FORM中的html元素的名称和值,例如 input select 但不是 label 等,转它们成为键值对,并通过HTTP POST请求发送到Web服务器到指定为FORM属性的URL(如http://myHost.com/Foo/Bar)。
Web服务器接收此请求并对其进行解析 - 包括URL查询字符串,标头,当然还有发布的数据。根据MVC会议和默认路由, http://myHost.com/Foo/Bar 表示所有请求数据都应转发到Foo控制器的Bar操作。内部动作programemr可以通过HttpContext.Request.Form集合访问FORM的值(以及许多其他请求信息)。但.NET MVC实现的另一个重点是模型绑定机制。它试图根据键和参数名称的相等性来映射Action参数上的传入FORMs键值对(实际上,它更复杂)。因此,如果您在页面上有/ select name =“myDdlId”/ html标记,并且用户选择了Id = 123和提交表单的第一个选项,那么传入的FORM键值对将是“myDdlId = 123”。使用 int myDdlId 参数提供Bar操作后,binder将自动填充“123”作为键并且参数名称相等。不仅可以在Action中使用简单类型的参数 - 实际上,您可以使用MyDdlId整数属性创建自己的MyModel类 - 绑定器将实例化对象并设置其MyDdlId = 123。默认活页夹非常智能,可以满足大多数需求,但您也可以创建自己的活页夹 因此,隐式绑定极大地帮助我们不要考虑FORMs值集合和键值对,我们只提供一个Action,将特殊设计的对象作为参数 - 瞧! - 立即使用相应的值填充此对象 获得所选项目的ID并对数据库执行查询后,您可以为用户显示实体。您需要有另一个视图模型类,如MyEntitiesViewModel,它可以保存实体数组。一旦从数据库中获得了非常大的业务实体,就可以创建MyEntitiesViewModel的实例 myEntitiesModel ,并使用所需的实体属性填充它。之后你编写 return View(“〜/ Views / AllEntities.cshtml”,myEntitiesModel); 表示你正在使用 AllEntities.cshtml 模板,提供myEntitiesModel,渲染为html页面并发送回客户端 这有用吗?

答案 1 :(得分:0)

用表格包裹<div>

@using (Html.BeginForm()) {
<div>
    @Html.DropDownList("File", new SelectList(ViewBag.Files, "Id", "protocol_site"), "Select webmail site", new { style = "vertical-align:middle;" })
    <button type="button">Select</button>
</div>
}

在您的控制器中实施POST请求处理程序。

[HttpPost]
public ActionResult Index(string File)
{
    ...
}

编写代码以返回或重定向到包含与协议匹配的文件列表的视图。