2009-06-03 6 views
31
나는 그런 HTML을 생성하기 위해 노력하고

ASP.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>이다), Html 헬퍼 확장은 초기 값을 선택합니다.

<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에 사용할 각 모델의 모든 특성을 잡아해야 할 것입니다.

하지만, 그것은 높게 당신이 새로 만든 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