还可以用jQuery调用ASP.NET

文章作者:w88手机版登录网络 上传时间:2019-07-07

真正走进ASP.NET MVC的社会风气,才驾驭它的地道。

“放弃WebService,在.NET4中用 jQuery 调用 WCF”——原本放弃WebService之后,还足以用jQuery调用ASP.NET MVC的Controller。

“Ajax为主的接纳无需ASP.NET MVC”,原本Ajax的世界更亟待ASP.NET MVC。

现已天真的主见,在实行中表明了它的高洁,但在从天真到真相的长河中,获得的是成材。

上边就谈谈自个儿是怎样认知到那几个的。相比较于结论,其中的长河更珍视。

要么以在此之前文章中的新浪站内短音讯成效(呈现当前用户短新闻列表)为例,起首用的是jQuery插件Templates举办列表数据绑定,后来境遇了四个难题:

1) 在绑按期索要依靠法则剖断生成不相同的要素,举个例子用户发过来的短音讯,发件人显示为链接,假使是系统通报,则呈现为文本。Templates对这么的操作处理起来不是很实惠;

2) 绑定后的多寡无法在服务端重用。一时从寻找引擎友好恐怕用户体验的角度,在页面第一回加载时,不用ajax,在页面加载后点击刷新或分页链接时,才使用ajax。那样就要在服务端与客户端独家维护数据绑定操作。

也正是说原本服务端重临的是实体类对象列表,今后要回到的是将数据与Html组装起来的字符串。

1. 初叶我们考虑的是一种丑陋的办法,用StringBuilder进行字符串拼接生成多少绑定结果,服务器端WCF服务中的代码如下:

图片 1

刚毅这种艺术易出错,维护性差。

  1. 随后咱们思虑了第三种艺术(仿照效法自Render User Control as String Template),通过Web User Control生成字符串。WCF服务中的代码如下:

    Page page = new Page(); Control control = page.LoadControl("~/Controls/MsgListControl.ascx"); ((IRenderable>)control).PopulateData(siteMsgList);
    StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) {

     using (HtmlTextWriter htw = new HtmlTextWriter(sw))
     {
         control.RenderControl(htw);
         return sb.ToString();
     }
    

    }

出于MsgListControl.ascx的类别是动态编译生成的,所以不能够透过强制类型调换将control转变为MsgListControl类型,然后传递数据给它。

那边需求通过三个别的的IRenderable<T>接口来落到实处多少的绑定,MsgListControl达成了那一个接口,代码如下:

public partial class MsgListControl : UserControl, IRenderable<List<SiteMsg>>
{
    public void PopulateData(List<SiteMsg> siteMsgList)
    {
        rptMsgList.DataSource = siteMsgList;
        rptMsgList.DataBind();
    }
}

public interface IRenderable<T>
{
    void PopulateData(T data);
}

在WCF服务中通过调用接口中的PopulateData方法开始展览数据的绑定。

本条方法增添了额外的接口,显得略微复杂。

  1. 后来我们想到了ASP.NET MVC,固然不熟悉,但要尝试一下,看行还是不行更好地消除那一个标题。

于是,上ASP.NET MVC 3,用Razor,咱们也MVC一把。

采用场景:在存活的VS二〇〇九 Web Site项目中央银行使ASP.NET MVC 3。MsgController收到须要后,由Inbox(两个Action)将包括短消息列表的凡事页面视图再次回到给客户端;当用户点击页面包车型地铁基础代谢或许分页链接时,通过Ajax发起POST央求以获得短新闻列表,MsgController收到诉求后,由List(贰个Action)将短音讯列表的视图重回给客户端。

指望的魔法:短音讯列表视图能重用,Inbox与List使用的是同五个视图。

一起先遭遇了三个小意思:

a) MapRoute配置之后,访谈现身" HTTP Error 404.0 - Not Found"错误。原因是访谈的网站未有公文名,未走ASP.NET管线。解决形式是在web.config的system.webServer中增进以下的布置:

<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" /> 

b) 继续访谈,现身“The resource cannot be found.”错误。化解办法:由于用的是Web Site项目,要将Controllers文件夹移至App_Code。

接下来走入MVC相关代码编写,先从Ajax调用部分开首。

Controller的代码如下:

public class MsgController : Controller
{
    [HttpPost]    
    public ActionResult List(SiteMsgQuery msgQuery)
    {
        List<SiteMsg> siteMsgList = GetInboxMsgList(msgQuery);
        return View("MsgList", siteMsgList);
    }
}

内需留心的就多少个地点:[HttpPost],既然是Ajax调用,当然要响应POST央浼。

View的代码(MsgList.cshtml)如下:

@using CNBlogs.UcHome.ExternalService.MsgWcfService
@model List<SiteMsg>           
@foreach(SiteMsg msg in Model){    
    <div class="msg_item">
    <div class="msg_sender">@msg.SenderName</div>
    <div class="msg_title"><a href='/msg/item/@msg.id/'>@msg.Subject</a></div>
    <div class="msg_sendtime">@msg.SendTime.ToString("yyyy-MM-dd HH:mm")</div>
    </div>
}

比在.ascx中写起来方便多了。

客户端js调用代码如下:

function GetMsgList(pageIndex, pageSize) {
    var msgQuery = {}
    msgQuery.PageIndex = pageIndex;
    msgQuery.PageSize = pageSize;
    $.ajaxSettings.dataType = 'plain/text';//不要用json    
    $.ajaxSettings.url = '/msg/list';
    $.ajaxSettings.data = '{"msgQuery":'   JSON.stringify(msgQuery)   '}';
    $.ajaxSettings.success = function (data) {
        $("#msg_list").html(data);
    };
    $.ajax();
}

内需专注的是四个地点(因为劳动器端Controller再次回到的不是json格式的数码):

a) dataType不要用json,用jQuery暗中同意的就行,要是钦定的话,就用plain/text;

b) 再次来到数据就在data中,不要通过data.d获取。

这么,用ASP.NET MVC就自在解决Ajax调用,比以前的WCF, StringBuider, .ascx都要有益于。

原先在ASP.NET MVC中采纳Ajax如此方便,完全可以代替在此之前用的WCF中转站。

减轻了Ajax的主题材料,接着管理整个页面包车型地铁展现。

在页面包车型大巴View中平素录取刚才Ajax所用的View就行了,示例代码如下:

View(Inbox.cshtml):

<!DOCTYPE html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        @Html.Partial("MsgList")
    </body>
</html>

Control:

public class MsgController : Controller
{
    public ActionResult Inbox()
    {
        SiteMsgQuery msgQuery = new SiteMsgQuery()
        {
            PageIndex = 1,
            PageSize = 30
        };
        List<SiteMsg> siteMsgList = GetInboxMsgList(msgQuery);
        return View("Inbox", siteMsgList);
    }  
}

化解!真的很实惠!想要的消除方案便是它--ASP.NET MVC!

在这里为本人的错误观点“Ajax为主的利用无需ASP.NET MVC”向我们道歉!请大家谅解!

好好学习,不进则退!


本文由w88手机版登录-www.w88zhan.com-优德w88app官方登录发布于w88手机版登录网络,转载请注明出处:还可以用jQuery调用ASP.NET

关键词: w88优德娱乐城