0

注意:我对 ASP.Net MVC 还是比较陌生,所以我可能在这里采取了错误的方法;不要犹豫,这样说。

问题的总结是,如果我有一个强类型化到某些模型对象集合(例如IEnumerable<ModelStateTest.Models.DataObject>,这些表单中的所有表单都会反映来自已编辑的特定对象的值。

我明白为什么会这样;如果您进行一些服务器端验证或处理,但它失败了,您不想丢弃所有用户的更改并恢复到以前存储在数据库中的内容。我不知道如何在表单绑定到多个对象的页面上管理此行为。

这是一些演示该行为的示例代码。如果您单击任何“保存”按钮,则所有三个表单都会反映您保存的表单中的任何字段值。我希望这种情况不会发生;我只想要保存的行来反映发布的表单变量。我只有粗略的想法如何实现这一点,我不想巧合地编写代码。

模型\DataObject.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ModelStateTest.Models {
    public class DataObject {
        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string Field3 { get; set; }
    }
}

控制器\HomeController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ModelStateTest.Models;

namespace ModelStateTest.Controllers {
    public class HomeController : Controller {
        public ActionResult Index() {
            return View("Index", new List<DataObject> {
                new DataObject { Field1 = "Obj 1, Field 1", Field2 = "Obj 1, Field 2", Field3 = "Obj 1, Field 3" },
                new DataObject { Field1 = "Obj 2, Field 1", Field2 = "Obj 2, Field 2", Field3 = "Obj 2, Field 3" },
                new DataObject { Field1 = "Obj 3, Field 1", Field2 = "Obj 3, Field 2", Field3 = "Obj 3, Field 3" }
            });
        }

        public ActionResult SaveItem(DataObject obj) {
            return Index();
        }
    }
}

视图\主页\Index.cshtml:

@model IEnumerable<ModelStateTest.Models.DataObject>

@{
    ViewBag.Title = "Index";
}

@foreach (var obj in Model) {
    using (Html.BeginForm("SaveItem", "Home", FormMethod.Get)) {
        @Html.TextBox("Field1", obj.Field1);
        @Html.TextBox("Field2", obj.Field2);
        @Html.TextBox("Field3", obj.Field3);
        <input type="submit" value="Save" />
    }
}
4

1 回答 1

0

所以这行得通,但它很糟糕。我在这里发布它,希望有人有更好的解决方案。如果我这样做,我基本上必须维护两组表单代码。

我在 DataObject 中添加了一个“主键”字段,并通过查看 Request.QueryString 来检查这是否是正在修改的项目。如果是,我使用 HTML Helpers。如果没有,我使用普通的旧输入标签。但我无法相信这是处理它的最佳方式。

模型\DataObject.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ModelStateTest.Models {
    public class DataObject {
        public int Key { get; set; }
        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string Field3 { get; set; }
    }
}

控制器\HomeController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ModelStateTest.Models;

namespace ModelStateTest.Controllers {
    public class HomeController : Controller {
        public ActionResult Index() {
            return View("Index", new List<DataObject> {
                new DataObject { Key = 1, Field1 = "Obj 1, Field 1", Field2 = "Obj 1, Field 2", Field3 = "Obj 1, Field 3" },
                new DataObject { Key = 2, Field1 = "Obj 2, Field 1", Field2 = "Obj 2, Field 2", Field3 = "Obj 2, Field 3" },
                new DataObject { Key = 3, Field1 = "Obj 3, Field 1", Field2 = "Obj 3, Field 2", Field3 = "Obj 3, Field 3" }
            });
        }

        public ActionResult SaveItem(DataObject obj) {
            return Index();
        }
    }
}

视图\主页\Index.cshtml:

@model IEnumerable<ModelStateTest.Models.DataObject>

@{
    ViewBag.Title = "Index";
}

@foreach (string name in Request.Form) {
    <pre>@name = @Request.Form[name]</pre>
}

@foreach (var obj in Model) {
    using (Html.BeginForm("SaveItem", "Home", FormMethod.Get)) {
        if (Request.QueryString["Key"] == obj.Key.ToString()) {
            @Html.Hidden("Key", obj.Key);
            @Html.TextBox("Field1", obj.Field1);
            @Html.TextBox("Field2", obj.Field2);
            @Html.TextBox("Field3", obj.Field3);
        } else {
            <input type="hidden" name="Key" value="@obj.Key" />
            <input type="text" name="Field1" value="@obj.Field1" />
            <input type="text" name="Field2" value="@obj.Field2" />
            <input type="text" name="Field3" value="@obj.Field3" />
        }
        <input type="submit" value="Save" />
    }
}
于 2013-09-03T12:45:46.653 回答