11

我觉得这可能是一个基本问题!

我有一个复杂的对象,即一个包含其他对象列表属性的文档对象。它是通过反序列化一些 XML 创建的。

我想将整个模型传递给视图

Return ViewResult(MyDoc)

在视图中编辑了一些属性。然后将控制权返回给 Post Controller:

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(Document myDoc)

“myDoc”现在只代表我的表单字段。我怀疑这是 ModelBinding 在工作。所以我想我需要将我的复杂对象保存在隐藏字段中(示例会很棒)或作为会话对象。但是我有点困惑我的更新字段如何合并回持久对象(隐藏或会话)。

4

2 回答 2

5

将那个大对象存储在视图中是否完全有必要?

似乎无法控制该View内容,因此您可能不想将所有数据发送到View. 似乎您正在应用一种基于 的思维方式ViewState,这与 MVC、恕我直言不太适合。

View和之间的通信Controller是通过 来完成ViewModels的,通常不需要存储任何大的序列化数据并在与服务器交互时来回进行。

您不能创建一个ViewModel仅代表视图(字段)的有用数据,并Action通过在 POST 期间接收该数据ViewModel,然后将您从视图获得的信息与您从 XML 加载的信息同步吗?只有在那个时候?

于 2012-11-23T02:23:32.117 回答
3

你是对的,这是工作中的模型绑定。

当您使用 HtmlHelpers 时,绑定几乎会自动发生,例如:

@Html.TextboxFor(model => model.PropertyName)

这条线实际上创造了一些像这样的东西:

<input type="textbox" id="Modelobject_PropertyName" name="ModelObject.PropertyName" />

然后,当您提交表单时,DefaultModelBinder能够反序列化 POST 值并创建给定类型的对象(至少它会尝试),如果找不到相应的条目,则该属性将为 null,如果条目没有对应的属性,它将被忽略(除非你有其他参数)。

您可以阅读这篇文章,它有点旧,但仍然非常准确。

例如:

假设您有一个简单的对象:

public class IndexModel
{
    public string MyProperty { get; set; }
    public bool MyCheckbox { get; set; }
}

一个简单的控制器:

public class TestingController : Controller
{
    [OutputCache(Duration=0, NoStore = true)]
    public ActionResult Index()
    {
        return View(new IndexModel { MyProperty = "hi" });
    }

    [HttpPost]
    [OutputCache(Duration=0, NoStore = true)]
    public ActionResult Index(IndexModel model)
    {
        model.MyProperty += "!";
        ModelState.Clear();
        return View(model);
    }
}

和一个简单的观点:

@model MvcApp.Models.IndexModel

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(model => model.MyProperty)<p />
        @Html.TextBoxFor(model => model.MyProperty) 
    </div>
    <div>
        @Html.LabelFor(model => model.MyCheckbox)<p />
        @Html.CheckBoxFor(model => model.MyCheckbox)
    </div> 

    <input type="submit" />
}

当您提交表单时,您将看到模型已完全重新创建。

如果您不想显示属性的实际值,但仍需要保留它:

@Html.HiddenFor(model => model.MyProperty)

这将生成一个隐藏字段,该字段将被回发并因此保留。

快乐编码!

于 2012-11-23T02:27:57.423 回答