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

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

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

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

于是有了以下代码

@model DataStruct.Models.Bussiness.CallMe
@Scripts.Render("~/bundles/jq/validate")
@Scripts.Render("~/bundles/ajaxform")
<script type="text/javascript">
function CallMeSuccess(data) {
if (data.code == ) {
alert("Success");
}
}
function CallMeFailure() {
alert("Failure");
}
</script> <div class="message">
<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>
@using (Ajax.BeginForm("CallMe", "Partial", new AjaxOptions
{
OnSuccess = "CallMeSuccess",
OnFailure = "CallMeFailure",
UpdateTargetId = "CallMeUpdateTarget",
InsertionMode = InsertionMode.Replace
}))
{
@Html.AntiForgeryToken()
<ul>
<li>
Name*<br>
@Html.EditorFor(model => model.Name)<br>
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</li>
<li>
E-mail*<br>
@Html.EditorFor(model => model.Email)<br>
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</li>
<li>
Phone*<br>
@Html.EditorFor(model => model.Phone)<br>
@Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
</li>
</ul>
<input class="sub" type="submit" value="CALL ME" />
}
<div id="CallMeUpdateTarget" class="text-danger"></div>
</div>
@model DataStruct.Models.User.Member

@{
ViewBag.Title = "regsiter——you can through this web regsiter an username.";
Layout = "~/Areas/C/Views/Shared/_LayoutLogin.cshtml";
} <link type="text/css" rel="stylesheet" href="@Url.Content("~/Areas/C/Content/css/regsiter.css")" />
@Scripts.Render("~/bundles/jq/validate")
@Scripts.Render("~/bundles/ajaxform")
<script type="text/javascript">
function RegsiterSuccess(data) {
if (data.code == ) {
window.top.location = "/c/CBase/Index";
}
}
function RegsiterFailure() {
alert("Failure");
}
</script> <!--登录注册主要内容-->
<div class="content">
<hr size="" color="#333" />
<h2>Create Your DirecTrucks.com Account</h2>
<p class="remind">Fields marked with an asterisk * are required</p>
<div class="regsiterForm">
@using (Ajax.BeginForm("Regsiter", "Jurisdiction", new AjaxOptions
{
OnSuccess = "RegsiterSuccess",
OnFailure = "RegsiterFailure",
UpdateTargetId = "RegsiterUpdateTarget",
InsertionMode = InsertionMode.Replace
}))
{
@Html.AntiForgeryToken()
<p class="remind">Enter Your Business Information</p>
<table width="" border="">
<tr>
<td><label for="Company">Your Company Name</label></td>
<td>@Html.TextBoxFor(model => model.Company, new { placeholder = "Please put your company name" })</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><label for="Use">The Truck Use</label></td>
<td>@Html.TextBoxFor(model => model.Used, new { placeholder = "your truck is used method" })</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><label for="number">Your Company Phone Number</label></td>
<td>@Html.TextBoxFor(model => model.CompanyPhone, new { placeholder = "6-12 letters or Numbers, can't begin with Numbers" })</td>
<td>&nbsp;</td>
</tr>
</table> <div id="RegsiterUpdateTarget" class="text-danger"></div>
<input type="submit" id="submit" name="submit" value="submit" />
}
</div>
</div>
<!--登录注册主要内容--> <!--客户留言板块-->
<!--PartialView-->
@{Html.RenderPartial("~/Areas/C/Views/Partial/CallMe.cshtml");}

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

    @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. 利用box-shadow实现伪边框透明到图片

    前阵子突然看到了一个效果,一张图片,有一个边框,但是边框可以透明到图片.直接上图 贴代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  2. IE7 自动为文件路径添加域名

    对于图片等文件的路径,一般在同一个域名下的文件都会使用相对路径,但如果使用JS获取文件的路径浏览器获取到的路径都是相对路径,但IE7会自动为路径添加域名变成绝对路径... IE7下图片路径,在文件相对 ...

  3. 关于angularjs指令

    一个指令用来引入新的HTML语法.指令是DOM元素上的标记,使元素拥有特定的行为.举例来说,静态的HTML不知道如何来创建和展现一个日期选择器控件.让HTML能识别这个语法,我们需要使用指令.指令通过 ...

  4. html5 拖拽函数1--不兼容火狐

    拖拽元素事件<br/>ondragstart拖拽前触发<br/>ondrag拖拽结束之前连续触发<br/>ondragend 拖拽结束前触发<br/>目 ...

  5. nginx 反向代理 公用一个外网端口

    服务器:ubuntu 配置nginx代理有2个文件,分别是sites-enabled 和sites-available. 路径都在/etc/nginx下,sites-enabled为sites-ava ...

  6. 正确解读free -m

    如下显示free是显示的当前内存的使用,-m的意思是M字节来显示内容.我们来一起看看. $ free -m total used free shared buffers cachedMem: 1002 ...

  7. mysql常用函数

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. 注:对大小写不敏感 ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大 ...

  8. java方法强制传递引用参数(做为返回值),改变被传递参数值。

    Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...

  9. Lintcode 97.二叉树的最大深度

    --------------------------------- AC代码: /** * Definition of TreeNode: * public class TreeNode { * pu ...

  10. linux作业

    第二单元 (1)以root用户登录GNOME图形界面 语言支持选择为汉语 (2)使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 (3)使用命令退出虚拟终端2上登录的用户 (4)使用快 ...