C# MVC 3 Ajax.ActionLink并返回由helper生成的新元素

C# MVC 3 Ajax.ActionLink并返回由helper生成的新元素,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我的页面图像上有: @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的扩展生

我的页面图像上有:

@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)));
}
所以,当我点击这张图片时,我会将数据发送到action。但是,我想用新的'src','alt','title'选项更新这个img,因此,需要返回相同的IHtmlString,由这个扩展从action生成

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

public IHtmlString AddToFavourite()
{
    IHtmlString result = Extansions.ImageActionLink(,"", "", "","", null, new AjaxOptions());
    return result;
}
解决方案: Out 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>
还有我们的控制器,它返回PartialView,我们在其中传递数据以调用html助手:

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"
        }
    });
}
是否可以不仅在视图中使用AjaxHelper的exension,而且在 控制器的作用方式是什么


不可以。您的控制器操作可能会返回一个包含对自定义帮助程序调用的分部。

Hm,没关系。我已更新代码以返回PartialView/PartialViewResult。生成MVCHtmlString和所有内容都很好,但请稍等,它不会更新页面和targetDelete=\everything,我应该更新containe元素所在的位置,而不是目标元素。太好了,thx;)
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"
        }
    });
}