mvc 4에서 부분 뷰에 매개 변수를 전달하는 방법


152

다음과 같은 링크가 있습니다.

 <a href='Member/MemberHome/Profile/Id'><span>Profile</span></a>

그리고 이것을 클릭하면이 부분 페이지가 호출됩니다.

 @{
    switch ((string)ViewBag.Details)
    {

        case "Profile":
        {
           @Html.Partial("_Profile"); break;
        }

    }
}

부분 페이지 _Profile에는 다음이 포함됩니다.

Html.Action("Action", "Controller", model.Paramter) 

예:

@Html.Action("MemberProfile", "Member", new { id=1 })   // id is always changing

내 의심은 어떻게이 "Id"를 model.parameter 부분에 전달할 수 있다는 것입니다 .

내 컨트롤러는 다음과 같습니다

 public ActionResult MemberHome(string id)
    {
        ViewBag.Details = id;
        return View();
    }
  public ActionResult MemberProfile(int id = 0)
    {
        MemberData md = new Member().GetMemberProfile(id);
        return PartialView("_ProfilePage",md);
    }

2
나는 그것을 얻지 못한다. 아마도 컨트롤러와 작업을 추가하면 도움이 될 수 있지만 지금 작성되었으므로 귀하의 질문을 이해하지 못합니다.
Liam

msdn 부분 확장에 대해 참조
Grundy

답변:


346

귀하의 질문을 이해하기는 어렵지만 요점을 얻는다면 기본보기에 부분적으로 렌더링하려는 일부보기 값이 있습니다.

부분 이름만으로 부분을 렌더링하는 경우 :

@Html.Partial("_SomePartial")

실제로 호출하는 것처럼 동일한 모델을 암시 적 매개 변수로 전달합니다.

@Html.Partial("_SomePartial", Model)

이제, 당신의 부분이 실제로 이것을 사용하기 위해서는, 예를 들어 다음과 같은 정의 된 모델이 필요합니다 :

@model Namespace.To.Your.Model

@Html.Action("MemberProfile", "Member", new { id = Model.Id })

또는 뷰 모델에없는 값 (ViewBag 또는 뷰 자체에서 생성 된 값)을 처리하는 경우 a를 전달할 수 있습니다 ViewDataDictionary

@Html.Partial("_SomePartial", new ViewDataDictionary { { "id", someInteger } });

그리고:

@Html.Action("MemberProfile", "Member", new { id = ViewData["id"] })

모델과 마찬가지로, Razor는 ViewData기본적으로 뷰의 부분을 암시 적으로 전달하므로 뷰에있는 경우 ViewBag.Id부분에서 동일한 것을 참조 할 수 있습니다.


4
기본 모델이 인터페이스를 구현하도록하는 경우 부분보기에서 해당 인터페이스를 모델로 사용하도록 할 수 있습니다. 그런 다음 많은 재사용을 얻을 수 있습니다.
Jess

@ChrisPratt 언제나처럼 매우 설명적인 답변 :) 투표 +
Murat Yıldız

6
나는 @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });이것을 위해 나를 위해 일해야했다. 다른 사람이 동일한 문제가있는 경우 VS2015 DNX 4.5.1을 사용하고 있습니다.
MikeTeeVee

46

내가 직접 검색하는 동안 단일 값으로 찾은 가장 짧은 방법 중 하나는 단일 문자열을 전달하고 문자열을 다음과 같이 모델로 설정하는 것입니다.

부분 전화 측에서

@Html.Partial("ParitalAction", "String data to pass to partial")

그런 다음 모델을 Partial View에 바인딩하십시오.

@model string

Partial View에서이 값을 사용하면

@Model

array, int와 같은 다른 데이터 유형이나 IDictionary와 같은 복잡한 데이터 유형 또는 다른 데이터 유형을 사용할 수도 있습니다.

도움이 되길 바랍니다.


4
깔끔하다! 정확히 내가 원하는 것. 감사.
Gautam Jain

내 부분은 내 모델이 필요하지 않았지만 모든 ViewData ModelState 항목을 보존해야했습니다. 내 부분보기에, 나는 할 수 있지만 여전히 ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
da_jokker

이것은 NullReferenceException객체의 인스턴스로 설정되지 않은 객체 참조를 계속 throw합니다 Model. 어떤 아이디어?
facepalm42 '

15

다음은 객체를 ViewDataDictionary로 변환하는 확장 메서드입니다.

public static ViewDataDictionary ToViewDataDictionary(this object values)
{
    var dictionary = new ViewDataDictionary();
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(values))
    {
        dictionary.Add(property.Name, property.GetValue(values));
    }
    return dictionary;
}

그런 다음 뷰에서 다음과 같이 사용할 수 있습니다.

@Html.Partial("_MyPartial", new
{
    Property1 = "Value1",
    Property2 = "Value2"
}.ToViewDataDictionary())

new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}구문 보다 훨씬 좋습니다 .

그런 다음 부분보기에서 ViewBag인덱스 속성이 아닌 동적 객체의 속성에 액세스하는 데 사용할 수 있습니다.

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>

ToViewDataDictionary정적 메소드를 어디에 두어야 합니까? 어디에서나 넣으려고하면 컴파일러 오류가 발생합니다.
Csaba Toth

2
@CsabaToth 이것은 확장 방법입니다. 정적 클래스에 배치 한 다음보기에서 해당 클래스를 참조하십시오.
Chris Haines

3

Asp.Net 코어의 경우 더 잘 사용하십시오

<partial name="_MyPartialView" model="MyModel" />

예를 들어

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.