1

この問題の解決策を見つけるのに苦労しています。

フォームの一部には、アクティビティで割り当てられたロールを持つユーザーを表示する複数行のテーブルが含まれています。これは、他の多くのセクションを持つ複雑なフォームの一部です。

使用可能なユーザーのドロップダウン リストに基づいてユーザーを変更し、それを ViewModel に反映させて、フォームの [保存] ボタンをクリックすると、変更されたユーザーがデータベースに保存されるようにしたいと考えています。これを実現する方法を見つけようとして立ち往生しています。

dropdwonlist の変更イベントに応答する次の JavaScript があり、変更イベントで期待どおりに動作しますが、ViewModel を更新する方法がわかりません。

    $("#RecipientsName").change(function () {
        var url = '@Url.Action("GetUser","Controller")';
        var data = { id: $(this).val() };
        $.ajax({
            type: 'Get',
            url: url,
            contentType: 'application/json; charset=utf-8',
            data: data,
            dataType: 'json',
            success: function (userInfo) {
                $('#UpdatedRecipientName').text('Hey');  // This does update the view
                alert(userInfo.Result);
            },
            error: function (userInfo) {
                alert('Failed');
            }
        });
    });

これがコントローラーのメソッドです。現時点では、渡された文字列を返すだけです。

    public ActionResult GetUser(string id)
    {

        return Json(new {Result = id},JsonRequestBehavior.AllowGet);
    }

これはかなり達成すべきことのように思えますが、まだ解決策を見つけていません。たぶん、私はこれに完全に間違って近づいています。うまくいけば、誰かが私を正しい方向に向けることができます。

ありがとう

4

1 に答える 1

2

MVC は、コントロールの名前に基づいてビュー モデルを解釈します。

したがって、ビューモデルが次のようになっているとします。

public class MyViewModel
{
    public string SomeProperty1 {get;set;}
    public string SomeProperty2 {get;set;}
}

フォームには、次のようなものが必要です。

<input type="text" name="SomeProperty1"/>
<input type="text" name="SomeProperty1"/>

全体表示の例:

@model TestMVC.Models.MyViewModel


<h2>TestAction</h2>

<script>
    function ChangeValue() {
        var textbox = document.getElementById('MyElementToChange1');
        textbox.value = 'Property 5';
    }
</script>
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>MyViewModel</legend>

    Some Property 1
            <input name="SomeProperty1" type="text" value="@Model.SomeProperty1" id="MyElementToChange1"/>

            Some Property 2
            <input name="SomeProperty2" type="text" value="@Model.SomeProperty2" id="MyElementToChange2"/>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
<input type="button" value="Change Value" onclick="ChangeValue()"/>
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

送信先のコントローラーには、次のようなものを含めることができます。

    public ActionResult TestAction()
    {
        MyViewModel viewModel = new MyViewModel();
        viewModel.SomeProperty1 = "Property 1";
        viewModel.SomeProperty2 = "Property 2";
        return View(viewModel);
    }

    [HttpPost]
    public ActionResult TestAction(MyViewModel viewModel)
    {
        return View(viewModel);
    }

この例では、ビュー内のボタンをクリックすると、SomeProperty1 の値が 5 に変更され、ActionResult TestAction(MyViewModel viewModel) メソッドを確認すると、SomeProperty1 の値が 5 であることがわかります。 .

JavaScript で行う必要があるのは、更新するプロパティと同じ名前の入力コントロールを更新することだけです。これは、アクションに送信されたビュー モデルの一部として使用されます。これにはラベルを使用できないことに注意してください。ユーザーが変更できないようにするプロパティがある場合は、非表示の入力を使用して値を保存する必要があります。

編集:javascriptを表示するためにビューにさらに追加

于 2013-02-20T16:36:14.963 に答える