10

私はこのようなajaxアクションリンクを持っています:

 <div style="float:left"> @Ajax.ActionLink("EMPLOYEE", "_PartialEmployeeIndex", "Employee", new AjaxOptions() { UpdateTargetId = "divToUpdate" }) </div>

私は通常、ブートストラップを使用してボタンのスタイルを次のように設定します。

  <input class="btn btn-info" type="button" value="Input">

またはこのように

 <button class="btn btn-success" type="submit"> </button>

では、どうすればajaxアクションリンクをブートストラップボタンに変換できますか?

ボタンは黒色のフォントと下線で表示されるため、ajaxアクションリンクを含むdivにクラス名を付けたくありません...

下線なしで白いフォントで実際のボタンとして表示したい

4

7 に答える 7

16

htmlAttributesパラメーターを使用して、必要なBootstrapクラスを追加できるはずです。

@Ajax.ActionLink("EMPLOYEE", "_PartialEmployeeIndex", "Employee", new AjaxOptions() { UpdateTargetId = "divToUpdate" }, new { @class = "btn" })
于 2012-06-01T20:35:08.807 に答える
7

アイコンのみが必要な場合は、次のように実行できます。

    @Ajax.ActionLink(" ", "Delete", new { id = 1 }, new AjaxOptions
                                        {
                                            Confirm = "Are you sure you wish to delete?",
                                            HttpMethod = "Delete",
                                            InsertionMode = InsertionMode.Replace,
                                            LoadingElementId = "div_loading"
                                        }, new { @class = "glyphicon glyphicon-trash" })
  • 名前ationlinkをnullまたは空にすることはできないため、スペースをお勧めします。
于 2013-11-18T12:15:11.203 に答える
5

buttonスタイリングハックではなく、実際のAjax要素が必要な場合は、それも可能ですが、少し複雑です。プライベートサポートメソッドの重複を削除すると、実際には違いが非常に小さいため、MSがHtmlヘルパーとAjaxヘルパーの両方にActionButtonを追加することをまだ選択していないのは残念です(以下に示すメソッドActionButtonGenerateButtonメソッドのみが必要です)。

最終結果は、ajaxアクションリンクのようにトリガーする実際のボタンを持つことができるということです。

例えば

@Ajax.ActionButton("Delete", "Delete", "document", 
     new { id = ViewBag.Id }, 
     new AjaxOptions() 
     { 
         Confirm="Do you really want to delete this file?", 
         HttpMethod = "Get", 
         UpdateTargetId = "documentlist" }, 
         new { id = "RefreshDocuments" 
     })

1.AjaxHelper拡張機能を作成します

以下のコードは、必要なヘルパーメソッドの多くがHtmlHelperで公開されていないため、AjaxExtensionsクラスの逆コンパイルに基づいています。

public static partial class AjaxExtensions
{
    public static MvcHtmlString ActionButton(this AjaxHelper ajaxHelper, string buttonText, string actionName, string controllerName, object routeValuesBlah, AjaxOptions ajaxOptions, object htmlAttributesBlah)
    {
        // Convert generic objects to specific collections
        RouteValueDictionary routeValues = new RouteValueDictionary(routeValuesBlah);
        RouteValueDictionary htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributesBlah);

        if (string.IsNullOrEmpty(buttonText))
            throw new ArgumentException("Button text must be provided");
        string targetUrl = UrlHelper.GenerateUrl((string)null, actionName, controllerName, routeValues, ajaxHelper.RouteCollection, ajaxHelper.ViewContext.RequestContext, true);
        return MvcHtmlString.Create(GenerateButton(ajaxHelper, buttonText, targetUrl, AjaxExtensions.GetAjaxOptions(ajaxOptions), htmlAttributes));
    }

    public static string GenerateButton(AjaxHelper ajaxHelper, string linkText, string targetUrl, AjaxOptions ajaxOptions, IDictionary<string, object> htmlAttributes)
    {
        TagBuilder tagBuilder = new TagBuilder("input");
        tagBuilder.MergeAttribute("value", linkText);
        tagBuilder.MergeAttributes<string, object>(htmlAttributes);
        tagBuilder.MergeAttribute("href", targetUrl);
        tagBuilder.MergeAttribute("type", "button");
        if (ajaxHelper.ViewContext.UnobtrusiveJavaScriptEnabled)
            tagBuilder.MergeAttributes<string, object>(ajaxOptions.ToUnobtrusiveHtmlAttributes());
        else
            tagBuilder.MergeAttribute("onclick", AjaxExtensions.GenerateAjaxScript(ajaxOptions, "Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), {0});"));
        return tagBuilder.ToString(TagRenderMode.Normal);
    }

    private static string GenerateAjaxScript(AjaxOptions ajaxOptions, string scriptFormat)
    {
        string str = ajaxOptions.ToJavascriptString();
        return string.Format((IFormatProvider)CultureInfo.InvariantCulture, scriptFormat, new object[1] { str });
    }

    private static AjaxOptions GetAjaxOptions(AjaxOptions ajaxOptions)
    {
        if (ajaxOptions == null)
            return new AjaxOptions();
        else
            return ajaxOptions;
    }

    public static string ToJavascriptString(this AjaxOptions ajaxOptions)
    {
        StringBuilder stringBuilder = new StringBuilder("{");
        stringBuilder.Append(string.Format((IFormatProvider)CultureInfo.InvariantCulture, " insertionMode: {0},", new object[1]
        {
             ajaxOptions.InsertionModeString()
        }));
        stringBuilder.Append(ajaxOptions.PropertyStringIfSpecified("confirm", ajaxOptions.Confirm));
        stringBuilder.Append(ajaxOptions.PropertyStringIfSpecified("httpMethod", ajaxOptions.HttpMethod));
        stringBuilder.Append(ajaxOptions.PropertyStringIfSpecified("loadingElementId", ajaxOptions.LoadingElementId));
        stringBuilder.Append(ajaxOptions.PropertyStringIfSpecified("updateTargetId", ajaxOptions.UpdateTargetId));
        stringBuilder.Append(ajaxOptions.PropertyStringIfSpecified("url", ajaxOptions.Url));
        stringBuilder.Append(ajaxOptions.EventStringIfSpecified("onBegin", ajaxOptions.OnBegin));
        stringBuilder.Append(ajaxOptions.EventStringIfSpecified("onComplete", ajaxOptions.OnComplete));
        stringBuilder.Append(ajaxOptions.EventStringIfSpecified("onFailure", ajaxOptions.OnFailure));
        stringBuilder.Append(ajaxOptions.EventStringIfSpecified("onSuccess", ajaxOptions.OnSuccess));
        --stringBuilder.Length;
        stringBuilder.Append(" }");
        return ((object)stringBuilder).ToString();
    }

    public static string InsertionModeString(this AjaxOptions ajaxOptions)
    {
        switch (ajaxOptions.InsertionMode)
        {
            case InsertionMode.Replace:
                return "Sys.Mvc.InsertionMode.replace";
            case InsertionMode.InsertBefore:
                return "Sys.Mvc.InsertionMode.insertBefore";
            case InsertionMode.InsertAfter:
                return "Sys.Mvc.InsertionMode.insertAfter";
            default:
                return ((int)ajaxOptions.InsertionMode).ToString((IFormatProvider)CultureInfo.InvariantCulture);
        }
    }

    public static string EventStringIfSpecified(this AjaxOptions ajaxOptions, string propertyName, string handler)
    {
        if (string.IsNullOrEmpty(handler))
            return string.Empty;
        return string.Format((IFormatProvider)CultureInfo.InvariantCulture, " {0}: Function.createDelegate(this, {1}),",
            new object[2]
              {
                propertyName,
                handler
              });
    }

    public static string PropertyStringIfSpecified(this AjaxOptions ajaxOptions, string propertyName, string propertyValue)
    {
        if (string.IsNullOrEmpty(propertyValue))
            return string.Empty;
        string str = propertyValue.Replace("'", "\\'");
        return string.Format((IFormatProvider)CultureInfo.InvariantCulture, " {0}: '{1}',",
            new object[2]
              {
                propertyName,
                str
              });
    }
}

2.jquery.unobtrusive-ajax.jsを変更します

jquery.unobtrusive-ajax.jsのJQueryに小さな変更を加えるだけで、新しいボタンオブジェクトを受け入れることができます。これは、最初から非常に近いためです。最初にセレクターはボタンとリンクを受け入れる必要があり、次にhrefは属性から取得する必要があります。これにより、非リンクが属性を提供できるようになります(厳密にはブラウザーに準拠していませんが、現時点では機能します)。

$(document).on("click", "input[data-ajax=true],a[data-ajax=true]", function (evt) {
        evt.preventDefault();
        asyncRequest(this, {
            url: $(this).attr("href"),
            type: "GET",
            data: []
        });
    });

*注:これは、回答日現在のすべての最新バージョンを使用しています(MVC 5)

于 2014-01-27T09:02:41.300 に答える
0

すべてのBootstrap要素に適切なクラスを割り当てることを心配したくない場合は、TwitterBootstrapMVCをチェックしてください。

ajaxリンクを使用した例では、次のように記述します。

@Ajax.ActionLink("EMPLOYEE", "_PartialEmployeeIndex", "Employee", ).AjaxOptions(new AjaxOptions() { UpdateTargetId = "divToUpdate" })
于 2014-01-31T17:28:00.600 に答える
0

Terryの回答に追加して、ボタンにhtmlを追加する場合は、Javascriptを使用してhtmlコードを追加するのが最善の方法です。Ajax.ActionlinkのlinkTextパラメーターは、提供されたテキストを自動的にエンコードします。これを回避するためにできることは何もありません(独自のヘルパーを作成する場合を除く)。

JQueryのappendやprependのようなものが機能します。

<div> 
@Ajax.ActionLink("EMPLOYEE", "_PartialEmployeeIndex", "Employee", new AjaxOptions() { UpdateTargetId = "divToUpdate" }, new { @class = "btn btn-default my-custom-class" }) 
</div>

<script>
    $(".my-custom-class").prepend("<span class=\"glyphicon glyphicon-pencil\"></span>&nbsp; ");
</script>
于 2016-09-12T22:22:15.120 に答える
0

別の方法は、HTMLを直接入力できるAjax.BeginFormを使用することです。これは、あなたがまだフォームに入っていないことを前提としています。

@using (Ajax.BeginForm("EMPLOYEE", "_PartialEmployeeIndex", "Employee", new AjaxOptions() { UpdateTargetId = "divToUpdate" }))
{
    <button type="submit" id="EmployeeButton" title="Employee" aria-label="Employee Button">
        <span class="glyphicon glyphicon-trash"></span>
    </button>
}
于 2019-07-29T21:00:21.440 に答える
-1
@Ajax.ActionLink(" ", "EditUser/" + Model.Id, null, new AjaxOptions { 
      OnSuccess = "userEditGet", 
      HttpMethod = "post", 
      LoadingElementId = "ajaxLoader" }
 ,new { @class = "btn btn-default glyphicon glyphicon-edit" })
于 2014-02-07T13:03:46.420 に答える