• ASP.NET MVC 3.0 知识记要(1)【RenderAction、Binding List、DropDownList】


    实践一. Html.RenderPartial

      在MVC2用法如:<%Html.RenderPartial( "SomeControl.ascx", ViewData.Model ); %>

      优点:使用简单,不需要任何Action

      缺点:   1.需具体用户控件的文件路径

          2.需要承担组织实体数据的任务

          3.路过Controller层直接向DB发出操作请求

      *最佳实践还是参考下面的"实践二",即采用 RenderAction(),让Action去请求对应的 PartialView。

    实践二. Model Binding to a List【模型绑定到属性集合】

      针对 Order-OrderDetails中的 OrderDetails集合(List)的 数据绑定+表单提交,这里举一简单示例:

      1.实体类

    public class Person
    {
    public string FirstName { set; get; }
    public string LastName { set; get; }
    }

      

      2.定义该实体类的Partial:PersonPartial

    @model jQueryUI_DataPicker.Models.Person

    @Html.TextBoxFor(m => m.FirstName)
    @Html.TextBoxFor(m => m.LastName)

      

      3.当属性是集合形式(List<T>)时需要作的处理

    @model IList<jQueryUI_DataPicker.Models.Person>

    @using (Html.BeginForm("InfancyEdit", "Home", FormMethod.Post))
    {
    for (int i = 0; i < Model.Count(); i++)
    {
    @Html.EditorFor(m => m[i]);
    }
    <input type="submit" value="提交" />
    }

      在主页面上针对Person是以集合的情况作处理,因为Person有自己的PartialView,所以直接采用 EditorFor() 就可以将 PartialView 中的标记自动生成过来,而且尤为重要的是,主页面会为各个PartialView设置不同的递增索引号,就像下面一样:

    <form action="/Home/InfancyEdit" method="post">
    <div class="editor-label"><label for="">FirstName</label></div>
    <div class="editor-field"><input class="text-box single-line" name="[0].FirstName" type="text" value="小李1_FN_66" /> <span class="field-validation-valid" data-valmsg-for="[0].FirstName" data-valmsg-replace="true"></span></div>
    <div class="editor-label"><label for="">LastName</label></div>
    <div class="editor-field"><input class="text-box single-line" name="[0].LastName" type="text" value="小李1_LN_66" /> <span class="field-validation-valid" data-valmsg-for="[0].LastName" data-valmsg-replace="true"></span></div>
    <div class="editor-label"><label for="">FirstName</label></div>
    <div class="editor-field"><input class="text-box single-line" name="[1].FirstName" type="text" value="小黄2_FN_77" /> <span class="field-validation-valid" data-valmsg-for="[1].FirstName" data-valmsg-replace="true"></span></div>
    <div class="editor-label"><label for="">LastName</label></div>
    <div class="editor-field"><input class="text-box single-line" name="[1].LastName" type="text" value="小黄2_LN_77" /> <span class="field-validation-valid" data-valmsg-for="[1].LastName" data-valmsg-replace="true"></span></div>
    <input type="submit" value="提交" />
    </form>

      4.表单在提交的时候,Controller中的Action所接受的类型肯定与该主页面顶端声明是一样的:

    [HttpPost]
    public ActionResult InfancyEdit(List<Person> people)
    {
    List<Person> _people = people;
    return View(_people);
    }

      

     实践三. 主页呈现 下拉框【最佳做法是实践四】

      方式有两种:第一种:在主页View另外调用 Html.RenderActoin(),以一个专有Action来返回该 下拉框的HTML标记和数据;

            第二种:在主页View所关联的Action里直接查询好该下拉框所需数据,赋予ViewBag.Category,然后在View里接受之。

      第一种方式实现:

        *主页View负责向指定的专有Action发起请求,然后该Action帮助PartialView进行数据查询和组织,最后交给PartialView去呈现!*

      1.不妨先定义好PartialView,名称可以为CategoryPartial.cshtml:

    @model IEnumerable<SelectListItem>

    @Html.DropDownList("Catetory", Model, "--请选择--")

       

      2.主页View开始对专有Action进行呼叫:

    Html.RenderAction("LoadCategoryPartial", "Order");

      3.最后由这个专有Action向数据访问层发起请求作数据的供给,然后一并交给PartialView呈现:

    [HttpGet]
    public ActionResult LoadCategoryPartial()
    {
    IEnumerable<SelectListItem> categoryList = new List<SelectListItem>()
    {
    new SelectListItem(){
    Value="1",
    Text = "公司外购"
    },
    new SelectListItem(){
    Value="2",
    Text = "公司内造"
    }
    };

    return PartialView("CategoryPartial", categoryList);
    }


    实践四.采用 ViewData["KeyName"]来传递 DropDownList所需要的绑定值,DropDownList的名称与 ViewData的键名相同

      绑定DropDownList:

    •   一是要指定好欲绑定项,一般直接来自数据库;
    •   二是添加指定好额外项,要么在Action里添加,要么在View里作设置。

    1.查询出下拉框将要呈现的项记录(目前是手造)

    List<Category> cateoryList = new List<Category>()
    {
    new Category(){
    CategoryID = 0,
    CategoryName = "公司内造"
    },
    new Category(){
    CategoryID = 1,
    CategoryName = "公司外购"
    }
    };

    2.把数据填充到 ViewData[""]字典:

    ViewData["CategoryID"] = new SelectList(cateoryList, "CategoryID", "CategoryName", "0");

      只要创建 SelectList实例即可,它的第一个参数只要是继承自 IEnumerable的集合即可,比如泛型集合List<>、数组[],

    后面两个参数就是指定一下哪个列对应Value,哪个列对应Text,以及最后指定一个默认值。

    3.主页面View上,只要把DropDownList的名称置为 CategoryID即可:

    @Html.DropDownList("CategoryID")

    另外如果想添加一个新项:“--请选择--”:

      可以直接在 Action中预先处理

    cateoryList.Insert(0, new Category()
    {
    CategoryID = 0,
    CategoryName = "--请选择--"
    });

      

      或者在View中后续补充处理,稍麻烦点之处在于为了添加这个额外option(其 text="--请选择--",value=""),需要把 ViewData[""]显式的设置一次:

    @Html.DropDownList("CategoryID", ViewData["CategoryID"] as SelectList, "--请选择--", new { @class = "red-hat" })





     

  • 相关阅读:
    javascript中的预编译问题
    五环
    两列布局
    定位以及z-index
    [vijos1234]口袋的天空<最小生成树>
    [讲解]prim算法<最小生成树>
    [noip模拟]B<构造>
    [JZOJ5343]健美猫<模拟>
    [noip模拟]心<并查集>
    [noip模拟]种花<快速幂+结论>
  • 原文地址:https://www.cnblogs.com/luoxiaonet/p/2364345.html
Copyright © 2020-2023  润新知