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"
}
});
}