【问题标题】:Unobtrusive JavaScript with jQuery in MVC 3在 MVC 3 中使用 jQuery 的不显眼的 JavaScript
【发布时间】:2011-11-18 14:12:25
【问题描述】:

假设我在 MVC 3 应用程序中的某个地方

if (Model.ImageListGallery != null)
{
    <h3>@ImagesTranslation.Gallery</h3>

    foreach (var imageInGallery in Model.ImageListGallery)
    {
        <div id="@imageInGallery.IdImage">
            <a rel="group" href= "@Url.Action("displaybig", "news", new { idNews = Model.IdNews, idImage = imageInGallery.IdImage })">
                <img src= "@Url.Action("displaysmall", "news", new { idNews = Model.IdNews, idImage = imageInGallery.IdImage })" alt=""/></a>
            @Html.Label(ImagesTranslation.Description)
            @Html.TextArea("Description", imageInGallery.Description, new { id = "area" + imageInGallery.IdImage, onfocus = "removeDisabledBtnOnImage('" + imageInGallery.IdImage + "')" })
            <button disabled="disabled" id="btn@(imageInGallery.IdImage)" onclick="saveDescription('@imageInGallery.IdImage')">@CommonTranslations.Save</button>
            <img class="@imageInGallery.IdImage" src="@Href("~/Content/delete.png")" onclick="deleteImage('@imageInGallery.IdImage')" title="@ImagesTranslation.DeleteImage" alt=""/>
        </div>
    }
}

在那种情况下你会如何使用不显眼的 JavaScript 和 jQuery(事件 onfocus 和 onclick?

【问题讨论】:

  • 我的意思是在 mvc 3 中这种编程是有价值的。正如我所见,Web 开发正试图避免以这种方式使用 html 事件

标签: javascript jquery asp.net-mvc asp.net-mvc-3


【解决方案1】:

通过向父 div 添加一个类,您可以将每个图库图像标识为需要在其元素中添加处理程序的内容:

foreach (var imageInGallery in Model.ImageListGallery)
{
    <div id="@imageInGallery.IdImage" class="gallery-image">
        <a rel="group" href= "@Url.Action(...)">
            <img src= "@Url.Action(..." alt=""/></a>
        @Html.Label(ImagesTranslation.Description)
        @Html.TextArea("Description", imageInGallery.Description, new { id = "area" + imageInGallery.IdImage })
        <button disabled="disabled" id="btn@(imageInGallery.IdImage)">@CommonTranslations.Save</button>
        <img class="@imageInGallery.IdImage" src="@Href("~/Content/delete.png")" title="@ImagesTranslation.DeleteImage" alt=""/>
    </div>
}
$(function() {
    $('.gallery-image').each(function() {
        var t = $(this);
        var imageId = t.attr('id');
        t.find('textarea').onfocus(function() {
            removeDisabledBtnOnImage(imageId);
        });
        t.find('btn').onclick(function(){
            saveDescription(imageId);
        });
        t.find('img').onclick(function(){
            deleteImage(imageId);
        });
    });
});

还有其他方法可以解决这个问题,但希望这能给你一个大致的想法。

【讨论】:

    【解决方案2】:

    利用数据属性(HTML5 中的新特性)将数据传递给您的 javascript。

    所以我会将您的视图代码更改为:

    if (Model.ImageListGallery != null)
    {
        <h3>@ImagesTranslation.Gallery</h3>
    
        foreach (var imageInGallery in Model.ImageListGallery)
        {
            <div id="image_@imageInGallery.IdImage" class="editable-image" data-image-id="@imageInGallery.IdImage">
                <a rel="group" href= "@Url.Action("displaybig", "news", new { idNews = Model.IdNews, idImage = imageInGallery.IdImage })">
                    <img src= "@Url.Action("displaysmall", "news", new { idNews = Model.IdNews, idImage = imageInGallery.IdImage })" alt=""/></a>
                @Html.Label(ImagesTranslation.Description)
                @Html.TextArea("Description", imageInGallery.Description, new { id = "area" + imageInGallery.IdImage })
                <button disabled="disabled" id="btn@(imageInGallery.IdImage)" >@CommonTranslations.Save</button>
                <img class="delete-image" src="@Href("~/Content/delete.png")" title="@ImagesTranslation.DeleteImage" alt=""/>
            </div>
        }
    }
    

    Javascript (jQuery)

    $(function() { 
       $('.editable-image').each(index,elem) {
    
          elem = $(elem);
          var id = elem.attr('data-image-id');      
          var delete = elem.find('.delete-image');
          var save = elem.find('button');
          var area = elem.find('textarea');
    
          delete.click(function() { deleteImage(id) });
          //etc..
       }
    });
    

    【讨论】:

    • 我更喜欢你的回答,但你能修复 'var id=...' 这一行吗?
    • 好的。伙计们。我很感激。一般来说,我知道不显眼的 JS 的优点,但在页面执行方面不是旧方法更快吗?或者这实际上是无关紧要的问题
    • @TheMentor:如果您的所有 CSS 和 javascript 都保存在静态、可缓存的文件中,那么在页面执行方面应该没有太大区别。您正在稍微减小页面中 HTML 的大小(这可能会使事情变得更快),同时导致 jQuery 在页面加载时进行一些额外的处理(这可能会使事情变慢)。但是,这两种影响都很小,很可能永远不会被您的用户注意到。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2011-05-15
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2011-06-12
    相关资源
    最近更新 更多