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




 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

posted @ 2012-02-23 10:13  罗霄(Sto)  阅读(436)  评论(0编辑  收藏  举报