1

无法找到解决此问题的方法。

表单的一部分包含一个多行表,其中显示在活动中具有分配角色的用户。它是与许多其他部分的复杂形式的一部分。

我想根据可用用户的下拉列表更改用户,并将其反映在 ViewModel 中,这样当在表单上单击后续“保存”按钮时,更改的用户将被保存回数据库。我一直试图弄清楚如何做到这一点。

我有以下 javascript 来响应 dropdwonlist 更改事件,它在更改事件上按预期工作,但不知道如何更新 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 只需更新与要更新的属性同名的输入控件,它将用作提交给 Action 的视图模型的一部分。请注意,您不能为此使用标签 - 如果您有一个您希望用户无法修改的属性,您应该使用隐藏的输入来存储该值。

编辑:在视图中添加了更多内容以显示 javascript

于 2013-02-20T16:36:14.963 回答