繁体   English   中英

MVC 3 Ajax.ActionLink并返回由助手生成的新元素

[英]MVC 3 Ajax.ActionLink and return new element generated by helper

我的页面图片上有:

@Ajax.ImageActionLink(Url.Content("~/Content/images/star-off.png"), "AddToFavourite", "Добавить в избранное", "img_add_to_favourite", null, new AjaxOptions() { HttpMethod = "Post", UpdateTargetId = "img_add_to_favourite" })

由AjaxHelper扩展生成:

public static IHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, string actionName, string altText, string ImgId, object routeValues, AjaxOptions ajaxOptions)
{
    var builder = new TagBuilder("img");
    builder.MergeAttribute("src", imageUrl);
    builder.MergeAttribute("alt", altText);
    builder.MergeAttribute("title", altText);
    builder.MergeAttribute("id", ImgId);
    var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions).ToHtmlString();
    return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing)));
}

因此,当我单击此图像时,我会将数据发送到操作中。 但是,然后,我想用新的'src','alt','title'选项更新此img,因此,需要返回该扩展名从action生成的相同的IHtmlString。

是否可以不仅在View中而且在控制器的操作方法中都对AjaxHelper使用exension? 第一个参数的问题:

public IHtmlString AddToFavourite()
{
    IHtmlString result = Extansions.ImageActionLink(,"", "", "","", null, new AjaxOptions());
    return result;
}

解决方案 :使用html helper,可以生成HTML标记:

public static IHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, string actionName, string altText, string ImgId, object routeValues, AjaxOptions ajaxOptions)
{
    var builder = new TagBuilder("img");
    builder.MergeAttribute("src", imageUrl);
    builder.MergeAttribute("alt", altText);
    builder.MergeAttribute("title", altText);
    builder.MergeAttribute("id", ImgId);
    var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions).ToHtmlString();
    return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing)));
}

我们的观点:

<div id="update_panel">
@{
    Html.RenderPartial("AddToFavourite", new MVCFairyTales3.Models.ViewModels.ViewModel_AddToFavourite{
        Action="AddToFavourite", 
        ImgId="img_add_to_favourite",
        TaleAn = ((PeopleTale)ViewBag.Tale).Analit,
        TaleType = 1,
        Title = "Добавить в избранное",
        Url = Url.Content("~/Content/images/star-off.png"),
        UserId = (Guid)ViewBag.UserId,
        ajaxOptions = new AjaxOptions() {
            UpdateTargetId = "update_panel",
            HttpMethod = "post"
        }
    }); 
}
</div>

局部视图:

@using MVCFairyTales3.Core;
@model MVCFairyTales3.Models.ViewModels.ViewModel_AddToFavourite
@Ajax.ImageActionLink(Model.Url, Model.Action, Model.Title, Model.ImgId, null, Model.ajaxOptions)

还有我们的控制器,该控制器返回PartialView,我们在其中传递数据以调用html helper:

public ActionResult AddToFavourite()
{
    Guid UserId = new Guid();
    if (User.Identity.IsAuthenticated)
    {
        MembershipUser myObject = Membership.GetUser();
        string sUserID = myObject.ProviderUserKey.ToString();
        UserId = new Guid(sUserID);
    }

    return PartialView("AddToFavourite", new MVCFairyTales3.Models.ViewModels.ViewModel_AddToFavourite
    {
        Action = "DeleteFromFavourite",
        ImgId = "img_delete_from_favourite",
        TaleAn = 1,
        TaleType = 1,
        Title = "Удалить из избранного",
        Url = Url.Content("~/Content/images/star-on.png"),
        UserId = UserId,
        ajaxOptions = new AjaxOptions()
        {
            UpdateTargetId = "update_panel",
            HttpMethod = "post"
        }
    });
}

是否可以不仅在View中而且在控制器的操作方法中都对AjaxHelper使用exension?

否。您的控制器操作可能会返回包含对自定义帮助程序的调用的部分代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM