爱上MVC3系列~分部视图中的POST
原创
©著作权归作者所有:来自51CTO博客作者仓储大叔的原创作品,请联系作者获取转载授权,否则将追究法律责任
在PartialView中进行表单提交,有什么用呢,我来总结一下:
1 这个表单不只一个地方用到
2 可能涉及到异步的提交问题
这两种情况都有可能需要把表单建立在“分部视图”中,我们为第二种情况为例来说一下用法
首先,我们有一个用户登陆的表单UserLogOn.cshtml,它在首页及产品列表页可能都提供了表现的情况,而这时,我们为了不违背DRY原则,所以会把相同的代码提取出来放到一个partial view中,这就是我们的UserLogOn.cshtml,而它里面只有视图的表现,没有任何提交的动作,因为它可能被提交到不同的Action中去。
实例选自大家都熟悉的MVC自带的项目
UserLogOn.cshtml代码如下:
1 @Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")
2
3 @using (Html.BeginForm()) {
4 <div>
5 <fieldset>
6 <legend>Account Information</legend>
7
8 <div class="editor-label">
9 @Html.LabelFor(m => m.UserName)
10 </div>
11 <div class="editor-field">
12 @Html.TextBoxFor(m => m.UserName)
13 @Html.ValidationMessageFor(m => m.UserName)
14 </div>
15
16 <div class="editor-label">
17 @Html.LabelFor(m => m.Password)
18 </div>
19 <div class="editor-field">
20 @Html.PasswordFor(m => m.Password)
21 @Html.ValidationMessageFor(m => m.Password)
22 </div>
23
24 <div class="editor-label">
25 @Html.CheckBoxFor(m => m.RememberMe)
26 @Html.LabelFor(m => m.RememberMe)
27 </div>
28
29 <p>
30 <input type="submit" value="Log On" />
31 </p>
32 </fieldset>
33 </div>
34
Index.cshtml中去调用它:
@Html.Partial("UserLogOn")
在HomeController中的Index方法(Action)中的代码可能是这样:
[HttpPost]
public ActionResult Index(LogOnModel model)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
return View();
}
OK,事实上,在其他页面有可能也用到了UserLogOn这个视图,但它的POST提交可能是不同的,可能同时要做其它的事件,这时,我们就可以通过@Html.Partial把视力的内容显示出来,而后
来提交事件在哪一个Action里去写,这样可以很好的实现业务的分离。
小知识:
在MVC2.0中,老赵曾经提出过将SCPX分部视力的内容以字符的形式输出,而不是直接到页面的输出流去相应,而在MVC3.0时代,小微把这个功能进行了封装与整合,并提出了两个方法,分别去调用视图和Action:
@Html.Partial()
@Html.Action()
当然,也可以使用MVC2.0的输出流方法:
@{Html.RenderPartial();}
@{Html.RenderAction();}
作者:仓储大叔,张占岭,
荣誉:微软MVP