35

我正在尝试生成这样的 HTML

    <form action="/some/process" method="post">
        <input type="hidden" name="foo.a" value="aaa"/>
        <input type="hidden" name="bar.b" value="bbb"/>
        <input type="submit" />
    </form>

所以它可以被这个Action处理:

    public ActionResult Process(Foo foo, Bar bar)
    {
        ...
    }

给定动作代码

    public ActionResult Edit()
    {
        ViewData["foo"] = new Foo { A = "aaa" };
        ViewData["bar"] = new Bar { B = "bbb" };

        return View();
    }

我应该在 Edit.aspx 视图中写什么?我不想手动编写名称“foo.a”和“bar.b”。

4

4 回答 4

43

字符串索引ViewData不好。您可能想要做的是为您的多变量视图数据创建一个小包装类,并将其传递给强类型视图。IE:

public class FooBarViewData
{
   public Foo Foo {get; set;}
   public Bar Bar {get; set;}
}
public ActionResult Edit()
{
   FooBarViewData fbvd = new FooBarViewData();
   fbvd.Foo = new Foo(){ A = "aaa"};
   fbvd.Bar = new Bar(){ B = "bbb"};
   return View(fbvd);
}

然后,您的视图只是强类型,您可以使用该属性FooBarViewData调用该对象的成员。Model

于 2009-06-03T12:08:21.453 回答
11

你有几个选择。首先,您可以从 ViewData 引用它们并使用 HtmlHelper 扩展。或者,您可以创建一个特定于视图的模型并为 Edit.aspx 使用强类型视图页。

public class EditModel
{
    public Foo foo { get; set; }
    public Bar bar { get; set; }
}

public ActionResult Edit()
{
    var model = new EditModel();

    model.foo = new Foo { A = "aaa" };
    model.bar = new Bar { B = "bbb" };

    return View( model );
}

(Edit.aspx 是类型ViewPage<EditModel>

无论哪种方式,HtmlHelper 扩展都会获取任何初始值。

<form action="/some/process" method="post">
     <%= Html.Hidden( "foo.A" ) %>
     <%= Html.Hidden( "bar.B" ) %>
</form>
于 2009-06-03T12:12:34.453 回答
0

上述解决方案可能已过时。该解决方案似乎适用于 ASP.Net MVC5+。

您将不得不使用该ViewModel方法。这是一个很好的教程,您可以查看。

http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example

您将不得不将多个模型合并为一个ViewModel,并从每个模型中获取您要使用的所有属性到ViewModel.

但是强烈建议您创建一个新的Controller和一个新的View来容纳新创建的ViewModel。阅读教程。

public class FooBarViewModel
{
   public string A {get; set;}  //Property for Foo
   public string B {get; set;}  //Property for Bar
}

public ActionResult Edit()
{
   FooBarViewModel fooBarVM = new FooBarViewModel();
   fooBarVM.A = "aaa";
   fooBarVM.B = "bbb";

   return View(fooBarVM);
}

但在这种情况下,您应该能够将其传递ViewModel到不同的视图中。只需确保在foobar.cshtml页面中正确声明此类似指令即可。

@model FooBar.Models.FooBarViewModel
于 2017-09-21T23:43:17.413 回答
0

我挣扎了一段时间试图让两个模型工作,我遇到的大多数答案都是针对早期版本的 MVC。

根据David Lee的建议,我发现以下教程最适合 MVC 5 :

http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example

我创建了一个连接并仅从两个模型中选择了我需要的列。

我让它与部分视图一起工作

在 view.cshtml

 @model IEnumerable<Test.Models.TestViewModel>
    ...
      @foreach (var item in Model)
                    {
                        <tr>
                            <td style="text-align:center;vertical-align:middle">
                                @Html.DisplayFor(modelItem => item.TestName)
...
于 2019-02-12T12:51:47.790 回答