【问题标题】:How to keep state of typed viewmodel objects in partial views?如何在部分视图中保持类型化视图模型对象的状态?
【发布时间】:2011-09-27 14:50:14
【问题描述】:

嗨,

我在 ASP.NET MVC 中有一个强类型视图。为了在未连接到字段(例如 TextBoxFor)时跟踪模型的属性,我将不得不使用 HTML.HiddenFor 元素。这使得操作数据并将其返回到服务器变得很容易。

现在说我的强类型视图包含一个局部视图,我从主视图中提供了一些我的模型,如下所示:

<% Html.RenderPartial("~/Views/Ad/Partial/ListSettings.ascx", Model.ALS); %>

所有用于读取和操作 ALS 属性(复杂对象)的 javascript 都放置在局部视图中,以便在其他主视图上使用局部视图。

在这个局部视图中,我还有以下几行:

<%: Html.HiddenFor(c => c.CP) %>
<%: Html.HiddenFor(c => c.L) %>
<%: Html.HiddenFor(c => c.OB) %>
<%: Html.HiddenFor(c => c.ST)%>
<%: Html.HiddenFor(c => c.P)%>

这可以很好地被 javascript 读取,但是在提交视图时,这些属性的设置不会跟随服务返回?

我确实尝试将它们放在主视图中,而不是像这样:

<%: Html.HiddenFor(c => c.ALS.CP) %>
<%: Html.HiddenFor(c => c.ALS.L) %>
<%: Html.HiddenFor(c => c.ALS.OB) %>
<%: Html.HiddenFor(c => c.ALS.ST)%>
<%: Html.HiddenFor(c => c.ALS.P)%>

并将 javascript 指向正确的字段,但即使这样可行,问题是局部视图不会包含它需要的所有内容,我必须在放置局部视图的每个主视图中实现这些隐藏字段?

如何处理?

致以最诚挚的问候

【问题讨论】:

    标签: .net asp.net-mvc view partial-views hidden-field


    【解决方案1】:

    如果用户不能修改所有这些字段,您可以简单地包含一个包含一些 id 的隐藏字段,以便您从数据源中取回它们。例如:

    <%= Html.HiddenFor(x => x.Id) %>
    

    现在这个 id 将被发送回控制器,如果它被包装在一个表单中或者可以被 javascript 使用并通过 AJAX 请求发送。在控制器操作中,您将使用 id 并从最初存储的位置获取所有内容:

    [HttpPost]
    public ActionResult Foo(int id)
    {
        var model = _repository.Get(id);
        ...
    }
    

    如果属性是可修改的,那么您将使用标准输入元素,例如允许用户设置其值的文本框和下拉列表,然后您的 POST 控制器操作会将更新后的视图模型作为参数。

    【讨论】:

    • 谢谢,我知道了。这里的问题是在partialView中使用和修改属性。属性不是由常规文本框和下拉菜单修改,而是由 javascript 修改。当用户点击菜单上的按钮时,设置将设置为属性和提交的表单。问题是从部分视图中将修改后的值返回给服务。
    • @SnowJim,好的,所以您可以使用隐藏字段或 AJAX。另外,我将使用编辑器模板代替 Partials,因为它们为默认模型绑定器生成正确的字段名称,以将它们正确绑定到操作参数。
    • 如果我将所有内容放在主视图中并使用 Html.HiddenFor(c => c.ALS.CP) 一切都会正常工作,从 javascript 修改的 CP 属性将在提交时返回.但是当将模型的一部分传递给局部视图并且我在那里使用隐藏字段时,属性将不会在提交时返回给服务,这是我的问题。我看不到如何在提交时将修改后的属性从部分视图返回到服务(部分视图放置在表单中。
    • @SnowJim,这就是为什么我建议你使用编辑器模板而不是部分。
    • 我想像这样:geekswithblogs.net/michelotti/archive/2010/02/05/…?但是我的项目在 Views\Shared 中没有 EditorTemplate 吗?只需手动添加它就可以工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2018-06-24
    • 2010-12-06
    相关资源
    最近更新 更多