2010-09-30 53 views
0

嗨,我正在构建我的第一个MVC 2应用程序,我真的很困惑所有我读的例子。我也为他们的Grid和其他类似的控件使用Telerik MVC套件。ASP.NET MVC 2关于Javascript的困惑

我已经阅读了很多教程和观看过的视频,但是我无法完全理解JavaScript放置位置的模式以及如何在合适的标记中包装代码块。比如我想通过跟随状态的一个DropDownList一国客户端相关联的任务(AZ,CA,等..):

我ClientController看起来是这样的:

void PopulateStates() 
{ 
    var tempRepo = RepositoryFactory.CreateRepostiory<State>(RepositoryType.Business); 
    var states = tempRepo.QueryAll().ToList(); 
    var svmList = states.Select(s => Mapper.Map<State, StateViewModel>(s)); 

    ViewData["States"] = svmList; 
} 

public ActionResult Index() 
{ 
    PopulateStates(); 
    return View(); 
} 

指数。 ASPX看起来是这样的:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <% Html.RenderPartial("ClientGrid"); %> 

</asp:Content> 

ClientGrid.ascx看起来是这样的:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %> 

<%= Html.Telerik().Grid<ViewModels.ClientViewModel>() 
    .Name("ClientGrid") 
    .EnableCustomBinding(true) 
    .DataKeys(keys => 
    { 
     keys.Add(c => c.Id); 
    }) 
    .ToolBar(commands => commands.Insert().ButtonType(GridButtonType.Text)) 
    .DataBinding(dataBinding => 
    { 
     dataBinding.Ajax() 
      .Select("_Select", "Clients", new Telerik.Web.Mvc.GridState()) 
      .Insert("_Insert", "Clients", new Telerik.Web.Mvc.GridState()) 
      .Update("_Save", "Clients", new Telerik.Web.Mvc.GridState()) 
      .Delete("_Delete", "Clients", new Telerik.Web.Mvc.GridState()); 
    }) 
    .Columns(columns => 
    { 
     columns.Bound(c => c.Id); 
      ... 

而且ClientV iewModel.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ViewModels.ClientViewModel>" %> 

<table> 
    <tr> 
    <td> 
    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.StateName) %> 
    </div> 
    <div class="editor-field"> 
     <%: Html.EditorFor(model => model.State) %> 
     <%: Html.ValidationMessageFor(model => model.State) %> 
    </div> 
    </td> 
    </tr> 
</table> 

最后编辑模板/Shared/EditorTemplates/StateViewModel.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ViewModels.StateViewModel>" %> 

<%= 
    Html.Telerik().DropDownList() 
    .Name("DropDownList") 
    .BindTo 
    (
     ((IEnumerable<ViewModels.StateViewModel>)ViewData["States"]) 
     .Where(s => s.StateType == "State") 
     .Select(s => new SelectListItem 
     { 
      Text = s.FormattedName, 
      Value = s.Id.ToString(), 
      Selected = (Model != null) ? (Model.Id == s.Id) : false 
     }) 
    ) 
%> 

一般情况下,我不明白这部分在客户端结束,哪一部分最终在服务器上编译。我也对lambda表达式和/或注册事件的不同符号感到困惑。

拉姆达的东西正在杀死我。我花大量的时间吨只是想弄清楚何时使用new {}() => ....

  1. 哪里去的JavaScript在这3个文件,并做我需要它特殊的标签?
  2. 我在哪里可以使用<%标签而不是<%=<%:
  3. 为什么它有时会在<%里面用分号结尾,如MyFunction();和其他时间只是MyFunction()

谢谢!

回答

0

Javascript几乎可以去任何地方,但将它放在主页面的<head>标记中是个好主意。在您的子页面中,您可以包含一个<content>标签,该标签将JavaScript专用于您的页面放置在主页面的适当位置。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="HeadContent" runat="server"> 
    //javascript goes here in <script> tags 
</asp:Content> 

<% VS <%: VS <%=

<%用于调用服务器上的功能,并做一些处理这输出数据到客户端。 <%:使用HTML编码到客户端用来输出字符串 - 当你输出它,你会看到&lt;script&gt;源,它这是输出的东西,用户可能输入,因为他们可能有自己的<script>标签非常有用不会得到解析为脚本 <%=用于输出一个字符串,但 HTML编码字符串

当你不输出到客户端分号时才使用。 (尽管一些罕见的函数仍然可以输出,但是它们会在内部输出,而不是返回一个字符串或者mvcstring,所以任何时候使用<% %>你最后都会添加一个;

+0

那么什么时候可以混合它们呢?要打开它们之间/关闭标签和括号中的规则 – John 2010-09-30 04:58:37

+0

那么,你可以混合使用JavaScript的任何地方真的...与问候,打开你只需要随时关闭已打开的标签关闭标签 - 括号应该是他们意义。在没有关闭它的情况下在'if'语句中打开标记是没有意义的,与'foreach'语句相同。 – Buildstarted 2010-09-30 05:36:24