【问题标题】:ASP.NET MVC Update part of the modelASP.NET MVC 更新部分模型
【发布时间】:2013-01-14 20:48:54
【问题描述】:

我有非常复杂的模型。流程是这样的: - 在控制器中,我从数据库中填充模型 - 在视图中我有几个标签。在第一个选项卡上填写信息后,第二个选项卡启用(这很好用),然后单击第二个选项卡按钮,我需要更新模型的一些属性。如何在不再次调用数据库以在控制器上填充模型的情况下做到这一点?该模型非常复杂,因此我无法将所有属性存储为“隐藏”。

我希望我已经足够清楚了。 感谢您的任何帮助

【问题讨论】:

  • 我并没有真正关注这种情况,但我会这样说:您更新模型并将您需要发回的所有内容发回。如果您要更新部分模型,则创建一个方法,该方法可以采用该部分模型进行更新并将模型的相同/不同部分(例如 ViewModels)服务器返回。

标签: asp.net-mvc jquery updatemodel


【解决方案1】:

我在使用 ASP.NET MVC 时遇到了同样的情况。我使用 ViewBag 以非常神奇的方式发送数据,创建 Javascript 字符串并使用 Html.Raw 运行它们,在许多地方使用 .executeSql,完成了真正的魔法。但毕竟我问过自己:痛苦值得吗?

无论您没有足够的时间(我的意思是这个!),我都强烈建议您阅读一些好的文档并尝试一些教程,然后再潜入解决方法的黑暗海洋。

不要忘记,通过良好的设计并很好地使用模型类的功能,您将不需要太多的变通方法,这首先会给您带来快乐。

根据您的情况;最好的地方是创建一个 Helper 类,例如:

public abstract class Helper<T> : WebViewPage<T>
{
    private dbContext db = new dbContext();

    public virtual whatEver yourUpdateOperation(int? id, string data)
    {
        // you can do your update operations here
        return whatEver;
    }
}

要将此类应用到所有网页,请更改 Views 目录中 web.config 文件中的行:

<pages pageBaseType="YourProject.HelperDirectory.Helper">

从现在开始,您可以从您的视图中调用 yourUpdateOperation,例如:

@foreach (var item in Model)
{
<tr>
    <td>
    <!-- View or operate things-->
    </td>
    @yourUpdateOperation(item.ID, data)
</tr>
}

希望这会有所帮助。

【讨论】:

  • 我不确定我是否理解...我需要在单击按钮时调用yourUpdateOperation。像这样,在第一次渲染视图的时候调用,对吧...whatEver是ComplexModel吗?
【解决方案2】:

使用模仿您的模型的 JSON 对象,并在用户单击不同的选项卡或其他任何内容时更新它。客户端更新/操作完成后,使用 AJAX 将您的 JSON 对象提交给控制器。以下是如何在单击按钮时执行此操作(您可以将其更改为单击的任何内容):

    <script src="../../Scripts/json2.js" type="text/javascript"></script>
    <input type="button" value="Partially Update my Model" onclick="UpdateYourModel()" />
        <input type="button" value="Save to Database" onclick="SaveToDataBase"/>
        <script type="text/javascript">
            // Create YourModel Json Object including child objects in it.
             var childObject={"ChildId": "","ChildDescription":""};
//The array name (childObjects) should match the collection name in your actual Model
            var yourModel= { "ModelId": "", "Description": "","childObjects[]":""  }; 


        function UpdateYourModel() {
        //update the childObject first
          childObject.ChildId=1;//any value from anywhere
          childObject.ChildDescription="any value";

        // Update the model
           yourModel.ModelId= $("#ModelId").val();
           yourModel.Description="This property was changed at client side";
           yourModel.childObjects.push(childObject);//add child object to yourModel

        //Likewise, update other properties of yourModel

        }//function ends here

        function SaveToDataBase()
        {
        $.ajax({
                    url: "URL to your controller",
                    data: JSON.stringify(yourModel),
                    type: 'POST',
                    contentType: 'application/json;',
                    dataType: 'json',
                    success: function (result) {
                     alert("Success");

                    }
                });
        }
        </script>

【讨论】:

  • 但是,在调用 UpdateComplexModel 之后,我需要使用 complexModel 和原始模型的属性重新填充内容。我不能同时使用这两者......另外,complexModel 之所以这样调用只是因为它很复杂......这意味着它具有(例如)其他对象数组的许多属性。我认为不可能用 javascript 来表示它。我希望我设法让自己清楚
  • @SandraS.,我只是将此模型命名为 ComplexModel,因为您没有提到它的名称。无论如何,我已经更新了在 JavaScript 中包含(表示)其他对象数组的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2020-10-23
相关资源
最近更新 更多