[asp.net-mvc] null 모델의 renderpartial이 잘못된 유형을 전달합니다.

페이지가 있습니다 :

<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>

그리고 그것에 :

<% Html.RenderPartial("TaskList", Model.Tasks); %>

다음은 DTO 객체입니다.

public class DTOSearchResults
{
    public string SearchTerm { get; set; }
    public IEnumerable<Task> Tasks { get; set; }

여기 부분이 있습니다.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>

Model.Tasks가 null이 아닌 경우 모든 것이 제대로 작동합니다. 그러나 null 일 때 :

사전에 전달 된 모델 항목은 ‘DTOSearchResults’유형이지만이 사전에는 ‘System.Collections.Generic.IEnumerable`1 [Task]’유형의 모델 항목이 필요합니다.

어떤 과부하를 사용 해야하는지 알지 못했기 때문에 명시 적으로하기 위해이 작업을 수행했지만 (아래 참조) 여전히 동일한 문제가 발생합니다!

<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>

null을 확인하거나 null을 전달하지 않아도이 문제를 해결할 수 있지만 그게 요점이 아닙니다. 왜 이런 일이 발생합니까?



답변

Andrew 당신이 얻는 문제는 전달하는 모델이 null 일 때 호출 (보기) 모델을 부분보기로 사용하는 RenderPartial 메서드의 결과라고 생각합니다.

<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary()); %>

도움이 되나요?


답변

@ myandmycode의 대답은 좋지만 약간 더 짧은 것입니다.

<% Html.RenderPartial("TaskList", new ViewDataDictionary(Model.Tasks)); %>

이것은 ViewDataDictionary모델을 보유하는 것이기 때문에 작동 하며 모델을 생성자 매개 변수로 허용 할 수 있습니다. 이것은 기본적으로 “전체”뷰 데이터 딕셔너리를 전달하는데, 물론 가능한 null 모델 만 포함합니다.


답변

전달하는 모델의 속성이 null 인 경우 MVC가 의도적으로 “부모”모델로 되돌아갑니다. 분명히 MVC 엔진은 null 모델 값을 이전 값을 사용하려는 의도로 해석합니다.

ASP.NET MVC, 강력한 형식의 뷰, 부분 뷰 파라미터 결함에 대한 자세한 내용은 여기를 참조하십시오.


답변

부분 뷰에서 이전 ViewData를 풀지 않으려면 다음을 시도하십시오.

<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary(ViewData){Model = null});%>


답변

해결책은 다음과 같이 HtmlHelper를 만드는 것입니다.

public static MvcHtmlString Partial<T>(this HtmlHelper htmlHelper, string partialViewName, T model)
{
    ViewDataDictionary viewData = new ViewDataDictionary(htmlHelper.ViewData)
    {
        Model = model
    };
    return PartialExtensions.Partial(htmlHelper, partialViewName, model, viewData);
}

Partial<T>(...)전과 일치Partial(...) 매우 편리하고 컴파일 모호성 오류입니다.

개인적으로 나는 행동을 이해하기가 어렵다는 것을 알았습니다. 이것을 디자인 선택으로 상상하기가 어렵습니까?


답변

이것이 답변되었지만, 나는 이것을 가로 질러 와서 문제를 해결하는 대신 내 프로젝트 에서이 문제를 해결하기로 결정했습니다 new ViewDataDictionary().

https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs 확장 프로그램 세트를 만들었습니다.

모델이 null 인 경우 나 또한 몇 가지 방법을 추가 한 부분을 호출하지 않습니다 이렇게하면 많은 if 문이 절약됩니다.

Razor 용으로 만들었지 만 두 스타일 중 일부는 aspx 스타일 뷰 (HelperResult를 사용하는 뷰가 호환되지 않을 수도 있음)와 함께 작동해야합니다.

확장 방법은 다음과 같습니다.

@* calls the partial with Model = null *@
@Html.PartialOrNull("PartialName", null)
@* does not call the partial if the model is null *@
@Html.PartialOrDiscard("PartialName", null)

방법도 있습니다 IEnumerable<object>모델에 있으며, 폐기 된 는 Razor 람다로 호출하여 일부 결과를 일부 HTML로 랩핑 할 수 있습니다.

원한다면 자유롭게 사용하십시오.


답변

이것에 대한 나의 해결책은 다음과 같습니다.


<% Html.RenderPartial("TaskList", Model.Tasks ?? new List()); %>