gpt4 book ai didi

asp.net-mvc-3 - 在 ASP.NET MVC3 中,如何渲染由多个模型支持的多个 PartialView?

转载 作者:行者123 更新时间:2023-12-02 04:09:55 24 4
gpt4 key购买 nike

在 MVC3 Razor 中,如何创建一个包含多个表单的页面,让每个表单都是用自己的模型渲染的局部 View ?

我们一直在尝试各种形式的调用 Html.RenderPartial(),传入部分 View 名称以及我们通过 ViewBag 访问的模型实例,但是我们尝试过的每种方法似乎都有严重的问题,并且所以我们必须对这在理想世界中应该如何运作有一个根本的误解。

我们发现一些关于类似主题的 SO 响应 (like this one) 推荐了一个“ super 模型”,其中包含对我们的局部 View 可能需要使用的每个子模型的引用,但我们找不到一个示例来说明您将如何实际使用这些模型子模型的数据,例如尝试编写 EditorTemplates 时。

编辑:让我稍微澄清一下我的问题。我们能够渲染局部 View 甚至是 Action (使用 Mark S. 推荐的 RenderAction)。但是,我们的主要问题是当这些表单提交回时,例如将模型的状态保存在该部分 View 区域中, Controller 似乎不知道我们引用的是什么模型。我们应该如何调用 Controller ?

我们尝试了几种不同的方式来渲染这些局部 View 。我们的第一次尝试是这样的:

@using (Html.BeginForm("SaveAccountInfo", null, FormMethod.Post, new { id = "section1-form" }))
{
@Html.EditorForModel("AccountInfo", (OurModels.AccountInfo) ViewBag.account_info)
}

ViewBag.account_info 包含这一局部 View 的模型数据。

我们也尝试过:
@{Html.RenderPartial("FormAccountInfo", (OurModels.AccountInfo) ViewBag.account_info);}

现在:
@{Html.RenderAction("FormAccountInfo", "Main", new { account_info = (OurModels.AccountInfo) ViewBag.account_info }); }

但是无论我们使用哪种方法在页面上呈现这个表单,当该表单被提交进行处理时,我们似乎无法通过模型访问任何提交的数据?我觉得我们在做一些非常愚蠢的事情,但我们是 MVC 的新手。

最佳答案

不要陷入抽象的困境,从您呈现页面到调用 Controller 方法的时间,您只在 HTML 和 HTTP 中工作。

如果您想回帖到不同的方法,有很多方法可以做到这一点。您的页面上可以有多个 HTML 表单,或者您可以使用 jQuery 之类的东西来执行帖子。哪个 Controller 操作接收您的帖子以及发回哪些数据取决于 HTML 页面上的表单及其内容。 MVC 处理程序将获取请求,并尝试将请求 URL 和内容绑定(bind)到与其匹配的可用操作之一。

要“回发模型”,您需要以模型绑定(bind)器可以读取的方式将数据发送回合适的操作。这可能是 JSON 数据(如果您使用的是 MVC 3)或具有名称-值对的表单。 Controller 虽然对请求数据的页面或其创建方式一无所知。它甚至不知道请求是否是由页面发出的。

您可以通过制作一个带有表单的普通 HTML 页面来亲自尝试,该表单设置为发布到您的 MVC Controller 之一的 URL。只要表单字段的名称与 Controller Action 参数的属性名称匹配,MVC 就会绑定(bind)它并调用 Action 。

如果您有复杂的 View ,您可能会发现 jQuery post 是一种不错的选择,它具有一些从页面收集数据并创建 JSON 对象以发送回的客户端方法。使用该方法可以非常精确地控制发回的数据,而使用表单则有限制(例如重叠数据等)。

编辑 - 回复评论

这是一个仅使用原始 HTML 来展示一个非常简单的案例的示例:

Public Class HomeController

'Other action methods...

<HttpPost()>
Function SayHello(myName As String) As ActionResult
Return Content("Hello " & myName)
End Function

End Class

和 HTML 表单(我在索引 View 中添加了这个,但它绝对可以去任何地方)
<form action="/Home/SayHello" method="post">
<input type="text" name="myName" />
<input type="submit" />
</form>

我在 <input> 上设置了名称匹配参数名称,这为 MVC 提供了帮助。虽然只有 1 个值被发回,但我可以将其命名为别的。但是,如果我这样做:
<form action="/Home/SayHello" method="post">
<input type="text" name="aName" />
<input type="text" name="anotherName" />
<input type="submit" />
</form>

...然后模型绑定(bind)器将不知道它应该使用哪个值,并且您会得到未正确设置的值。

但是改为:
<form action="/Home/SayHello" method="post">
<input type="text" name="myName" />
<input type="text" name="anotherName" />
<input type="submit" />
</form>

...并且模型绑定(bind)器现在能够使用名称来正确识别要使用的值和要忽略的值。

在强类型操作的情况下:
Public Class HomeController

<HttpPost()>
Function SayHello(person As SimplePerson) As ActionResult
Return Content("Hello " & person.FirstName)
End Function

End Class

Public Class SimplePerson
Public Property FirstName As String
Public Property Surname As String
End Class

您需要具有与属性名称对应的表单名称。我的 aName/anotherName 表单会发回正确的形状,但模型绑定(bind)器不会设置任何属性,因为它不知道什么是什么。然而,这会起作用:
<form action="/Home/SayHello" method="post">
<input type="text" name="FirstName" />
<input type="text" name="Surname" />
<input type="submit" />
</form>

关于asp.net-mvc-3 - 在 ASP.NET MVC3 中,如何渲染由多个模型支持的多个 PartialView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5783443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com