实践一. 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" })