10 Stimmen

ASP.Net MVC 3.0 Ajax.ActionLink dynamisches Objekt Route Werte mit javascript

0 Projekt

Meiner Ansicht nach habe ich eine versteckte Datei, die eine UserID . Diese Benutzerkennung wird bei einer Aktion generiert (sie ist also vorher nicht bekannt).

Sobald dieses versteckte Feld einen Wert hat, möchte ich diesen Wert als Actionlink-Routenwert verwenden. Kann ich es mit einem Jquery-Selektor tun.

Mein verstecktes Feld ist

<input id="NewUserID" type="hidden" value="80">

Mein ajax.ActionLink ist

@Ajax.ActionLink("Edit", "EditUser", "User", new { UserID = "$('#GetNewPatientID').val()" },
        new AjaxOptions
        {
            OnSuccess = "ShowEditUserForm",
            UpdateTargetId = "EditUserDetails",
            InsertionMode = InsertionMode.Replace,
            HttpMethod = "Get"
        }, new { @class = "button", id = "EditUserButton" }) 

Wissen Sie, ob dies möglich ist?

12voto

Darin Dimitrov Punkte 990883

Wenn Sie den Aktionslink auf dem Server generieren, können Sie einen speziellen Platzhalter für den UserID-Routenwert einfügen:

@Ajax.ActionLink(
    "Edit", 
    "EditUser", 
    "User",    
    new { 
        UserID = "__userid__" 
    },
    new AjaxOptions {
        OnSuccess = "ShowEditUserForm",
        UpdateTargetId = "EditUserDetails",
        InsertionMode = InsertionMode.Replace,
        HttpMethod = "Get"
    }, 
    new { 
        @class = "button", 
        id = "EditUserButton" 
    }
) 

und dann, wenn Sie einen Wert auf das ausgeblendete Feld in Javascript zuweisen, könnten Sie die Aktion Link href als gut zu aktualisieren:

$('#EditUserButton').attr('href', function() {
    return this.href.replace('__userid__', $('#NewUserID').val());
});

4 Stimmen

Wenn Sie erneut auf den Link klicken und einen anderen Wert eingeben müssen, wie können Sie den Wert wiederfinden und ändern?

0 Stimmen

Ich finde es ein bisschen enttäuschend, dass das die schönste Art ist. AJAX-Aufrufe in freier Wildbahn sind in der Regel gehen, um Benutzereingaben auf der Seite zu verbrauchen, und mit .replace() eine magische Zeichenfolge mit meinem eigenen String zu verwenden, das ist nur hacky.

7voto

Tomasz Jaskuλa Punkte 15373

Vielleicht würde so etwas funktionieren. Setzen Sie die Aktion Link in einem div und ändern Sie es mit Jquery auf der Client-Seite.

<div id="ajaxTest">
@Ajax.ActionLink("Edit", "EditUser", "User", new { UserID = "$('#GetNewPatientID').val()" }, 
        new AjaxOptions 
        { 
            OnSuccess = "ShowEditUserForm", 
            UpdateTargetId = "EditUserDetails", 
            InsertionMode = InsertionMode.Replace, 
            HttpMethod = "Get" 
        }, new { @class = "button", id = "EditUserButton" })  
</div>

<script type="text/javascript"> 
     $(document).ready(function(){ 
        $("#ajaxTest a").click(function (event) { 
            $(this).attr('href', "/EditUser/Edit?UserId='+ $('#NewUserId).val() +'"); 
     }); 
     }); 
</script>

1voto

Atters Punkte 771

Die Antwort von Darin ist großartig und hat mir geholfen, aber wie der Kommentar vorschlägt, wenn Sie den Link erneut anklicken und einen anderen Wert übergeben müssen, wie machen Sie das? Dies ist eine Voraussetzung, wenn Sie Teilansichten usw. aktualisieren. Hier ist also, wie ich genau das erreicht habe...

$(document).ready(function () {
    $('#replyMessageButton').click(function () {
        var url = $("#replyMessageButton").attr("href")
        $("#replyMessageButton").attr("href", TrimToSlash(url) + $("#MessageId").val())
    });
});

function TrimToSlash(value) {

    if (value.indexOf("/") != -1) {

        while (value.substr(-1) != '/') {
            value = value.substr(0, value.length - 1);
        }
    }
    return value;
}

        @Ajax.ActionLink("Reply", "ReplyMessage", "MessageBox", new { id = -1 },
                        new AjaxOptions
                            {
                                UpdateTargetId = "replyMessageContainer",
                                InsertionMode = InsertionMode.Replace,
                                OnBegin = "UpdateDisplay('replyMessage')",
                                OnFailure = "UpdateDisplay('default')"
                            },
                            new { @id = "replyMessageButton" }
                            )

Außerdem wurde eine Prüfung auf messageId > 0 im Controller implementiert, weshalb die id auf -1 initialisiert ist. Ist diese Bedingung nicht erfüllt, wird eine "Error"-Ansicht zurückgegeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X