最近采用一边工作一边学习的方式使用MVC5+EF6做一个Demo项目, 期间遇到不少问题, 一直处于研究状态, 没能来得及记录.

今天项目进度告一段落, 得以有空记录学习中遇到的一些问题.

由于MVC的PartialView非常的灵活, 类似与WebForm的UserControl, 配合母版页可以大大节约重复开发UI的时间

既然UI可以是Partial的, 那么只要把Form放到PartialView中, 在Form中写好Action地址, 是不是每个Partial就拥有了自己独立的完整的处理逻辑了呢?

于是有了以下代码

  1. @model DataStruct.Models.Bussiness.CallMe
  2. @Scripts.Render("~/bundles/jq/validate")
  3. @Scripts.Render("~/bundles/ajaxform")
  4. <script type="text/javascript">
  5. function CallMeSuccess(data) {
  6. if (data.code == ) {
  7. alert("Success");
  8. }
  9. }
  10. function CallMeFailure() {
  11. alert("Failure");
  12. }
  13. </script>
  14.  
  15. <div class="message">
  16. <p style="margin-bottom:20px;">Subscribe to Our Newsletter: Do you want to hear from us? Just fill out the form to subscribe for free.</p>
  17. @using (Ajax.BeginForm("CallMe", "Partial", new AjaxOptions
  18. {
  19. OnSuccess = "CallMeSuccess",
  20. OnFailure = "CallMeFailure",
  21. UpdateTargetId = "CallMeUpdateTarget",
  22. InsertionMode = InsertionMode.Replace
  23. }))
  24. {
  25. @Html.AntiForgeryToken()
  26. <ul>
  27. <li>
  28. Name*<br>
  29. @Html.EditorFor(model => model.Name)<br>
  30. @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
  31. </li>
  32. <li>
  33. E-mail*<br>
  34. @Html.EditorFor(model => model.Email)<br>
  35. @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
  36. </li>
  37. <li>
  38. Phone*<br>
  39. @Html.EditorFor(model => model.Phone)<br>
  40. @Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
  41. </li>
  42. </ul>
  43. <input class="sub" type="submit" value="CALL ME" />
  44. }
  45. <div id="CallMeUpdateTarget" class="text-danger"></div>
  46. </div>
  1. @model DataStruct.Models.User.Member
  2.  
  3. @{
  4. ViewBag.Title = "regsiter——you can through this web regsiter an username.";
  5. Layout = "~/Areas/C/Views/Shared/_LayoutLogin.cshtml";
  6. }
  7.  
  8. <link type="text/css" rel="stylesheet" href="@Url.Content("~/Areas/C/Content/css/regsiter.css")" />
  9. @Scripts.Render("~/bundles/jq/validate")
  10. @Scripts.Render("~/bundles/ajaxform")
  11. <script type="text/javascript">
  12. function RegsiterSuccess(data) {
  13. if (data.code == ) {
  14. window.top.location = "/c/CBase/Index";
  15. }
  16. }
  17. function RegsiterFailure() {
  18. alert("Failure");
  19. }
  20. </script>
  21.  
  22. <!--登录注册主要内容-->
  23. <div class="content">
  24. <hr size="" color="#333" />
  25. <h2>Create Your DirecTrucks.com Account</h2>
  26. <p class="remind">Fields marked with an asterisk * are required</p>
  27. <div class="regsiterForm">
  28. @using (Ajax.BeginForm("Regsiter", "Jurisdiction", new AjaxOptions
  29. {
  30. OnSuccess = "RegsiterSuccess",
  31. OnFailure = "RegsiterFailure",
  32. UpdateTargetId = "RegsiterUpdateTarget",
  33. InsertionMode = InsertionMode.Replace
  34. }))
  35. {
  36. @Html.AntiForgeryToken()
  37. <p class="remind">Enter Your Business Information</p>
  38. <table width="" border="">
  39. <tr>
  40. <td><label for="Company">Your Company Name</label></td>
  41. <td>@Html.TextBoxFor(model => model.Company, new { placeholder = "Please put your company name" })</td>
  42. <td>&nbsp;</td>
  43. </tr>
  44. <tr>
  45. <td><label for="Use">The Truck Use</label></td>
  46. <td>@Html.TextBoxFor(model => model.Used, new { placeholder = "your truck is used method" })</td>
  47. <td>&nbsp;</td>
  48. </tr>
  49. <tr>
  50. <td><label for="number">Your Company Phone Number</label></td>
  51. <td>@Html.TextBoxFor(model => model.CompanyPhone, new { placeholder = "6-12 letters or Numbers, can't begin with Numbers" })</td>
  52. <td>&nbsp;</td>
  53. </tr>
  54. </table>
  55.  
  56. <div id="RegsiterUpdateTarget" class="text-danger"></div>
  57. <input type="submit" id="submit" name="submit" value="submit" />
  58. }
  59. </div>
  60. </div>
  61. <!--登录注册主要内容-->
  62.  
  63. <!--客户留言板块-->
  64. <!--PartialView-->
  65. @{Html.RenderPartial("~/Areas/C/Views/Partial/CallMe.cshtml");}

大家注意到以下这货, 它是MVC AjaxForm必须的JS组件

  1. @Scripts.Render("~/bundles/ajaxform")
    //BundleConfig bundles.Add(new ScriptBundle("~/bundles/ajaxform").Include("~/Scripts/jquery.unobtrusive-ajax.min.js"));

两个PartialView由于业务独立. 都引用了这货, 然后就是这货, 由于页面渲染的时候, 会加载两次, 导至点击任意一个Submit, 后台均会收到两次提交, 这显然不是我要的

于是乎把它提取到母版页中去, 包含关系变为了 母版页(含AjaxForm JS组件) > Reg > CallMe, 这样CallMe也能使用母版页的AjaxForm JS组件, 正确的异步Submit

那有人要问了, 为什么要使用AjaxForm整这一出呢? 用同步的Form不就好了啊?

答案详见: http://blog.csdn.net/hanxuemin12345/article/details/38872807

同步提交是会且必须要转跳页面的, 跳回当前页也叫转跳, 所以虽然更简单, 但是不够灵活

15年圣诞节补充:

如果PartialView是强类型视图, 同时View也是强类型视图, 且两个类型不一样. 则必须用Render.Action或者Action方式加载PartialView

否则页面渲染的时候会报 "传入类型不是PartialView定义的类型" 错误

因为类型是Action传入的, 如果PartialView不用Action加载, 则View页面渲染的时候会把View的Model通过View的Action传递给PartialView导致传递类型错误

MVC Html.BeginForm 与 Ajax.BeginForm 使用总结的更多相关文章

  1. MVC小系列(十一)【Html.BeginForm与Ajax.BeginForm】

    Html.BeginForm与Ajax.BeginForm都是mvc的表单元素,前者是普通的表单提交,而后者是支持异步的表单提交,直接用mvc自带的Ajax.BeginForm就可以很容易完成一个异步 ...

  2. Html.BeginForm() vs Ajax.BeginForm() in MVC3

    我们知道,BeginForm()方法能创建一个Form标签,因此可以结合表单级的方法,在这个页面中.我一直在考虑Html.BeginForm()方法和Ajax.BeginForm()方法在MVC3中有 ...

  3. 爱上MVC3系列~Html.BeginForm与Ajax.BeginForm

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  4. Html.BeginForm())与Ajax.BeginForm()

     一.@using (Html.BeginForm())参数示例 1.指定表单提交方式和路径等 @using (Html.BeginForm("Index", "Home ...

  5. 转:MVC3系列:~Html.BeginForm与Ajax.BeginForm

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  6. MVC3系列~Html.BeginForm与Ajax.BeginForm

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  7. form表单和ajax表单提交(Html.BeginForm()、Ajax.BeginForm())的差别

    有如下几种区别: 1. Ajax在提交.请求.接收时,都是异步进行的,网页不需要刷新: Form提交则是新建一个页面,哪怕是提交给自己本身的页面,也是需要刷新的: 2. A在提交时,是在后台新建一个请 ...

  8. asp.net core mvc 异步表单(Ajax.BeginForm)

    .net core中已经没有beginform扩展函数了. 通过Bower引入jquery-ajax-unobtrusive: <script src="~/lib/jquery-aj ...

  9. @using (Html.BeginForm()) @using (Ajax.BeginForm(new AjaxOptions() { })) 区别

    @using (Html.BeginForm()) 返回页面 也是页面 都是返回页面 只是 多了一个 data-ajax="true"

随机推荐

  1. C语言位域

    转载自 http://tonybai.com/2013/05/21/talk-about-bitfield-in-c-again/ 再谈C语言位域 五 21 bigwhite技术志 bitfield, ...

  2. canvas的save与restore方法的作用

    网上搜罗了一堆资料,最后总结一下. save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. restore:用来恢复Canvas之前保存的状态. ...

  3. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决办法

    这个问题的原因是没有导入mysql连接库,我从官网上下载后照着网上的教程各种导入无果,最后发现是我导入的文件错了.... 官网上下下来的压缩文件是这个,不过这并不是直接要导入的文件,首先解压文件,然后 ...

  4. JS学习:第二周——NO.2正则

    1.[正则] 就是用来操作(匹配和捕获)的一系列规则: 匹配:校验字符串是否符合我们的规则:返回值--布尔值           匹配这里用的是正则的方法:test(),reg.text( ); 捕获 ...

  5. php简单框架的应用实例

    <html> <frameset rows="50%,50%"> <frame src="/Test/header.php"> ...

  6. sed命令详解

    搜索 纠正错误  添加实例 sed 功能强大的流式文本编辑器 补充说明 sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...

  7. test1.xlsx

    耿丹CS16-2班第三次作业汇总 排名 学号后三位 姓名 作业顺序 作业情况 第三周博客 总得分 博客园地址 1 232 周* 1 8.5 3 12.5 http://www.cnblogs.com/ ...

  8. python Unicode 编码解码

    1 #将Unicode转换成普通的Python字符串:"编码(encode)" 2 unicodestring = u"Hello world" 3 utf8s ...

  9. python之路十九

    1.Django请求生命周期        -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串        -> URL对应关系(匹配) -> 视图函数 ...

  10. Ninject学习(一) - Dependency Injection By Hand

    大体上是把官网上的翻译下而已. http://www.ninject.90iogjkdcrorg/wiki.html Dependency Injection By Hand So what's Ni ...