一、JavaScriptResult在MVC中的定义的代码片段

 
C# 代码   复制
mvc JavaScriptResult的用法
mvc JavaScriptResult的用法public class JavaScriptResult : ActionResult
{
mvc JavaScriptResult的用法public override void ExecuteResult(ControllerContext context)
{        
mvc JavaScriptResult的用法         HttpResponseBase response = context.HttpContext.Response;
mvc JavaScriptResult的用法         response.ContentType = "application/x-javascript";
mvc JavaScriptResult的用法         response.Write(this.Script);
mvc JavaScriptResult的用法     }
{ get; set; }
mvc JavaScriptResult的用法 }
mvc JavaScriptResult的用法mvc JavaScriptResult的用法public abstract class Controller : ControllerBase, ...
{
mvc JavaScriptResult的用法//其他成员
mvc JavaScriptResult的用法     protected virtual JavaScriptResult JavaScript(string script);
mvc JavaScriptResult的用法 }
mvc JavaScriptResult的用法

 

其中:JavaScriptResult的属性Script表示响应的JavaScript脚本,而用于响应JavaScript脚本的ExecuteResult方法除了将脚本内容写入当前HttpResponse之外,还会将响应的媒体类型设置为“application/x-javascript”(不是“text/javascript”)。

 

二、可以通过ContentResult来实现与JavaScriptResult一样的脚本响应功能

 

例如下面两段代码效果一样

 
C# 代码   复制
mvc JavaScriptResult的用法
mvc JavaScriptResult的用法//JavaScriptResult:
mvc JavaScriptResult的用法     public class FooController : Controller
{
mvc JavaScriptResult的用法public ActionResult JavaScript()
{
mvc JavaScriptResult的用法return JavaScript("alert('Hello World!');");
mvc JavaScriptResult的用法         }
mvc JavaScriptResult的用法     }
mvc JavaScriptResult的用法mvc JavaScriptResult的用法//ContentResult:
mvc JavaScriptResult的用法    public class FooController : Controller
{
mvc JavaScriptResult的用法public ActionResult JavaScript()
{
mvc JavaScriptResult的用法return Content("alert('Hello World!');", "application/x-javascript");
mvc JavaScriptResult的用法        }
mvc JavaScriptResult的用法    }
mvc JavaScriptResult的用法

 

 

三、JavaScriptResult实例

 

下面演示一个在线购物的场景:用于完成了商品选购之后提交订单,服务端在处理订单的时候需要确认订购的商品是否超出了对应的库存量,如果存量充裕则正常处理该订单,否则提示库存不足,并将商品实时库存量显示给用户让他修正相应商品的购买量。我们利用JavaScript的方式来提示订单处理结果的消息(成功处理或者库存不足),很显然这段JavaScript应该是动态的(库存量是动态的)。

 

1、定义一个ShoppingCart类表示购物车。如下面的代码片断所示,ShoppingCart是表示购物车商品项ShoppingCartItem对象的列表,而ShoppingCartItem的三个属性(Id、Name和Quantity)分别表示商品ID、名称和订购数量。

 
C# 代码   复制
mvc JavaScriptResult的用法
mvc JavaScriptResult的用法public class ShoppingCart : List<ShoppingCartItem>
{}
mvc JavaScriptResult的用法mvc JavaScriptResult的用法public class ShoppingCartItem
{
{ get; set; }
{ get; set; }
{ get; set; }
mvc JavaScriptResult的用法     }
mvc JavaScriptResult的用法

 

 

2、创建如下一个HomeController。我们在默认的Action方法Index中创建一个包含三个商品的ShoppingCart对象,并将其作为Model呈现在对应的View中。Action方法ProcessOrder用于处理提交的购买订单,如果订购商品的数量没有超过库存量(通过一个静态字典字段stock表示),则通过调用alert函数提示“购物订单成功处理”,否则提示“库存不足”,并将相应商品当前库存量显示出来。

 

 
C# 代码   复制
mvc JavaScriptResult的用法
mvc JavaScriptResult的用法public class HomeController : Controller
{
mvc JavaScriptResult的用法private static Dictionary<string, int> stock = new Dictionary<string, int>();
mvc JavaScriptResult的用法static HomeController()
{
mvc JavaScriptResult的用法             stock.Add("001", 20);
mvc JavaScriptResult的用法             stock.Add("002", 30);
mvc JavaScriptResult的用法             stock.Add("003", 40);
mvc JavaScriptResult的用法         }
mvc JavaScriptResult的用法public ActionResult Index()
{
mvc JavaScriptResult的用法            ShoppingCart cart = new ShoppingCart();
 });
 });
 });
mvc JavaScriptResult的用法return View(cart);
mvc JavaScriptResult的用法        }
mvc JavaScriptResult的用法mvc JavaScriptResult的用法public ActionResult ProcessOrder(ShoppingCart cart)
{
mvc JavaScriptResult的用法            StringBuilder sb = new StringBuilder();
mvc JavaScriptResult的用法foreach (var cartItem in cart)
{
mvc JavaScriptResult的用法if (!CheckStock(cartItem.Id, cartItem.Quantity))
{
mvc JavaScriptResult的用法                    sb.Append(string.Format("{0}: {1};", cartItem.Name,stock[cartItem.Id]));
mvc JavaScriptResult的用法                }
mvc JavaScriptResult的用法            }
mvc JavaScriptResult的用法if(string.IsNullOrEmpty(sb.ToString()))
{
mvc JavaScriptResult的用法return Content("alert('购物订单成功处理!');", "text/javascript");
mvc JavaScriptResult的用法            }
mvc JavaScriptResult的用法string script = string.Format("alert('库存不足! ({0})');", sb.ToString().TrimEnd(';'));
mvc JavaScriptResult的用法return JavaScript(script); 
mvc JavaScriptResult的用法        }
mvc JavaScriptResult的用法mvc JavaScriptResult的用法private bool CheckStock(string id, int quantity)
{
mvc JavaScriptResult的用法return stock[id] >= quantity;
mvc JavaScriptResult的用法        }
mvc JavaScriptResult的用法    }
mvc JavaScriptResult的用法

 

3、创建Action方法Index对应的View。在一个以Ajax请求提交的表单(表单的Action属性对应着上面定义的Action方法ProcessOrder)中显示了购物车中的商品和数量,用于可以修改订购数量并通过点击“提交订单”按钮以Ajax请求的方式提交订单。

 

 
C# 代码   复制
mvc JavaScriptResult的用法
mvc JavaScriptResult的用法    @model ShoppingCart
mvc JavaScriptResult的用法<html>
mvc JavaScriptResult的用法<head>
mvc JavaScriptResult的用法<title>用户登录</title>
mvc JavaScriptResult的用法<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.6.2.js")"></script>   1:         <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")">
mvc JavaScriptResult的用法</script>        
mvc JavaScriptResult的用法</head>
mvc JavaScriptResult的用法<body>
mvc JavaScriptResult的用法             @using (Ajax.BeginForm("ProcessOrder", new AjaxOptions()))
{
mvc JavaScriptResult的用法for (int i = 0; i < Model.Count; i++)
{         
mvc JavaScriptResult的用法<div>
mvc JavaScriptResult的用法                        @Html.HiddenFor(m=>m[i].Id)
mvc JavaScriptResult的用法                        @Html.HiddenFor(m => m[i].Name)
mvc JavaScriptResult的用法mvc JavaScriptResult的用法                        @Html.DisplayFor(m => m[i].Name):
mvc JavaScriptResult的用法                        @Html.EditorFor(m => m[i].Quantity)
mvc JavaScriptResult的用法</div>
mvc JavaScriptResult的用法                }
mvc JavaScriptResult的用法<input type="submit" value="提交订单" />
mvc JavaScriptResult的用法            }
mvc JavaScriptResult的用法</body>
mvc JavaScriptResult的用法</html>
mvc JavaScriptResult的用法

 

4、运行结果:一个包含三个商品的购物车信息会被呈现出来,当我们输入相应的订购数量并点击“提交订单”后,订单处理结果消息会弹出来。下图所示的就是库存不足的情况下显示的消息。

 

mvc JavaScriptResult的用法

 

相关文章: