GVKun编程网logo

如何从控制器传递多个模型对象以及如何将所有作为命令对象传递给spring mvc中的form:form?

13

对于如何从控制器传递多个模型对象以及如何将所有作为命令对象传递给springmvc中的form:form?感兴趣的读者,本文将会是一篇不错的选择,并为您提供关于ajax–将Map传递给springMV

对于如何从控制器传递多个模型对象以及如何将所有作为命令对象传递给spring mvc中的form:form?感兴趣的读者,本文将会是一篇不错的选择,并为您提供关于ajax – 将Map传递给springMVC控制器、ASP.NET MVC 5 - 将数据从控制器传递给视图、asp.net-mvc – 如何在ASP.NET MVC中将多个对象传递给ViewPage?、asp.net-mvc – 如何将复杂对象传递给ASP.NET MVC中的另一个View?的有用信息。

本文目录一览:

如何从控制器传递多个模型对象以及如何将所有作为命令对象传递给spring mvc中的form:form?

如何从控制器传递多个模型对象以及如何将所有作为命令对象传递给spring mvc中的form:form?

场景就像我想从控制器传递多个模型对象一样,我可以实现,

 model .addAttribute(“person”, new Person()); model.addAttribute(“address”, new Address());

但是如何在spring视图中同时通过两者或更多

<form:form action=”registration” command=”person”>

因为它只允许我传递一个命令。然后如何将所有require命令传递给它们。

答案1

小编典典

只需将person和都添加address到一个称为的信封对象中,personDetails然后将其传递给表单即可。

class PersonDetails {    private Person person;    private Address address;    ...}PersonDetails personDetails = new PersonDetails();personDetails.setPerson(new Person());personDetails.setAddress(new Address());model.addAttribute(“personDetails”, personDetails);<form:form action=”registration” command=”personDetails”>

完成后,您将必须path适当修改。

<form:input path="firstName" />

变成

<form:input path="person.firstName" />

其他更优雅的选择是封装Address内的Person,只是露出Person一个命令。就像@Seabook在下面的答案中提到的那样。

ajax – 将Map传递给springMVC控制器

ajax – 将Map传递给springMVC控制器

我试图从ajax发送HashMap或任何其他Map实现到 Spring MVC控制器

这是我如何做的细节:

Ajax调用如下

var tags = {};
tags["foo"] = "bar";
tags["whee"] = "whizzz";


$.post("doTestMap.do",{"tags" : tags },function(data,textStatus,jqXHR) {
if (textStatus == 'success') {
    //handle success
    console.log("doTest returned " + data);
} else {
    console.err("doTest returned " + data);
}
});

然后在控制器方面我有:

@RequestMapping(value="/publisher/doTestMap.do",method=RequestMethod.POST)
public @ResponseBody String doTestMap(@RequestParam(value = "tags",defaultValue = "") HashMap<String,String> tags,HttpServletRequest request) {  //

    System.out.println(tags);

    return "cool";
}

不幸的是我系统地得到了

org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Map'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Map]: no matching editors or conversion strategy found

我究竟做错了什么 ?

谢谢.

在弹簧控制器中绑定地图的方式与绑定数组的方式相同.无需特殊转换器!

但有一点要记住:

> Spring使用命令对象作为顶级值持有者.命令对象可以是任何类.

所以你需要的是一个包装类(TagsWrapper),它包含一个Map< String,String>类型的字段.叫做标签.
绑定数组的方法相同.

这在文档中得到了很好的解释,但我偶尔忘记了包装器对象的需要;)

您需要更改的第二件事是提交标记值的方式:

>每个地图键使用一个表单参数,而不是完整映射的完整字符串表示.
>一个输入值应如下所示:

<input type="text" name="tags[key]" value="something">

如果标签是包装器中的映射,则这样就可以开箱即用于表单提交.

ASP.NET MVC 5 - 将数据从控制器传递给视图

ASP.NET MVC 5 - 将数据从控制器传递给视图

在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图。控制器类将响应请求来的URL。控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果会发送回浏览器。视图模板可以被控制器用来产生格式化过的HTML从而返回给浏览器。

控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML。最佳做法是:一个视图模板应该永远不会执行业务逻辑或者直接和数据库进行交互。相应的,一个视图模板应该只和控制器所提供的数据进行交互。维持这种"隔离关系"可以帮助,保持代码的干净、测试性和更易维护。

当前, HelloWorldController类中Welcome操作方法需要一个name和一个numTimes参数,然后直接输出给浏览器。相比只返回一个字符串,让我们来改变控制器,来使用视图模板吧。视图模板将生成动态的HTML,这意味着您需要通过适当的方式把数据从控制器传递给视图,从而才能生成动态的HTML。您可以把视图模板需要的动态数据 (参数)在控制器中放入到一个ViewBag对象中,然后视图模板可以访问这个对象。

打开HelloWorldController.cs文件,更改 Welcome方法,将MessageNumTimes的值添加到 ViewBag对象里。ViewBag是一个动态的对象,这意味着在您没有给ViewBag放置属性时,它没有任何属性,您可以把任何您想放置的对象放入到 ViewBag对象中。 ASP.NET MVC model binding system 会自动将地址栏中URL里的 query string映射到您方法中的参数(namenumTimes)。

完整的HelloWorldController.cs文件如下所示:

using System.Web;
using System.Web.Mvc;
namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Welcome(string name, int numTimes = 1)
{
ViewBag.Message = "Hello " + name;
ViewBag.NumTimes = numTimes;
return View();
}
}
}

现在ViewBag对象包含了数据,并将自动传递给视图模板。 接下来,您需要一个欢迎视图模板 !在生成菜单中,选择生成 MvcMovie (快捷键 Ctrl+Shift+B) ,以确保项目编译成功。

Views\HelloWorld文件夹上,右键单击”添加(视图)”,选择MVC 5 View Page with (Layout Razor).”

clip_image002

在 “指定项名称 (Specify Name for Item )” 对话框, 输入” Welcome”, 点击“确定(OK)”.    
在“
选择布局(the Select a Layout Page”对话框,接受缺省的”布局_Layout.cshtml”,并点击“确定(OK)”.    
clip_image004

MvcMovie\Views\HelloWorld\Welcome.cshtml文件创建成功。

在Welcome.cshtml文件里替换标记, 您将创建一个循环,循环说多次“Hello”。

下面显示了完整的Welcome.cshtml文件。

@{
ViewBag.Title = "Welcome";
}
<h2>Welcome</h2>
<ul>
@for (int i = 0; i < ViewBag.NumTimes; i++)
{
<li>@ViewBag.Message</li>
}
</ul>

运行应用程序,并浏览下面的 URL : http://localhost:xx/HelloWorld/Welcome?name=Scott&numtimes=4

现在,模型绑定(model binder) 使得数据从URL传递给控制器。控制器将数据装入到ViewBag对象中,通过该对象传递给视图。然后视图为用户生成显示所需的HTML。

clip_image006

在上面的示例中,我们使用了ViewBag对象把数据从控制器传递给了视图。在本系列教程后面的文章中,我们将使用视图模型来将数据从一个控制器传递到视图中。用视图模型来传递数据,这一般是首选的办法。Blog Dynamic V Strongly Typed Views 有更加详细的介绍。

到这里,这是一种"M"模型,但不是数据库的那种“M”模型。让我们来创建一个电影数据库吧。

学习了本节内容,才能更好的理解数据是如何从控制器传递到视图显示的。在掌握这些MVC知识的同时,也可以借助一些开发工具来帮助开发过程。ComponentOne Studio ASP.NET MVC 这款轻量级控件能与Visual Studio无缝集成,完全与MVC6和ASP.NET 5.0兼容,将大幅提高开发效率。

asp.net-mvc – 如何在ASP.NET MVC中将多个对象传递给ViewPage?

asp.net-mvc – 如何在ASP.NET MVC中将多个对象传递给ViewPage?

我想我知道答案,但我想反思一些想法.

我想将几个(在这个例子中为2个)一些不同的数据传递给View.我最初的想法是简单地将各种对象包装成一个包含对象并沿着这种方式传递它们.然后从视图中,我会有类似的东西

var objContainer = ViewData.Model;
var thisObject = objContainer.ThisObject;
var thatObject = objContainer.ThatObject;

这些可以在母版页和查看页中单独使用.

这是“最好的”方式吗?

解决方法

我发现创建要呈现给视图的其他专用类很有用.我将它们保存在一个名为“Core.Presentation”的独立命名空间中,以保持组织有序.这是一个例子:
namespace Core.Presentation
{
    public class SearchPresentation
    {
        public IList<StateProvince> StateProvinces { get; set; }
        public IList<Country> Countries { get; set; }
        public IList<Gender> Genders { get; set; }
        public IList<AgeRange> AgeRanges { get; set; }
    }
}

然后我确保我的View是一个强类型视图,它使用该表示类的泛型版本:

public partial class Search : ViewPage<SearchPresentation>

在View中,我可以使用Intellisense轻松浏览项目.

asp.net-mvc – 如何将复杂对象传递给ASP.NET MVC中的另一个View?

asp.net-mvc – 如何将复杂对象传递给ASP.NET MVC中的另一个View?

我正在尝试将一个复杂的对象(可以序列化,如果有帮助)传递给另一个视图.

目前这是我的代码,在某些控制器方法中: –

User user = New User { Name = "Fred,Email = "xxxx" };
return RedirectToAction("Foo",user);

现在,我在同一个控制器中有以下动作……

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Foo(User user)
{
 ...
}

当我在那里设置断点时,代码会在那里停止,但user的值为null.
我需要做什么?我错过了global.asax中的内容吗?

欢呼:)

解决方法

将您的User对象放在TempData中.您不能将其作为参数传递.

TempData["User"]  = new User { Name = "Fred",Email = "xxxx" };
return RedirectToAction("Foo");

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Foo()
{
    User user = (User)TempData["User"];
    ...
}

与How can I maintain ModelState with RedirectToAction?相似

关于如何从控制器传递多个模型对象以及如何将所有作为命令对象传递给spring mvc中的form:form?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于ajax – 将Map传递给springMVC控制器、ASP.NET MVC 5 - 将数据从控制器传递给视图、asp.net-mvc – 如何在ASP.NET MVC中将多个对象传递给ViewPage?、asp.net-mvc – 如何将复杂对象传递给ASP.NET MVC中的另一个View?的相关知识,请在本站寻找。

本文标签: