2009-06-03 115 views
31

我想产生这样的HTMLASP.NET MVC - 查看与多个模型

<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> 

,因此它可以通过这个行动进行处理:

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'。

回答

39

字符串索引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属性,对象的成员。

8

你有几个选择。首先,您可以从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> 
0

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

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

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

你将不得不多车型加入到一个ViewModel和抓住从您要使用到ViewModel每个模型的所有属性。

,它是HIGHLY建议你创建一个新的控制器和新查看以适应新创建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