2011-07-07 17 views
19

Wyświetlany jest częściowy widok jako część żądania Ajax.ASP.NET MVC3 dodaje HtmlFieldPrefix podczas wywoływania Controller.PartialView

Kiedy zadzwonić częściowego widoku z widoku:

int i=0; 
foreach(var rule in Model.Rules) { 
    @Html.Partial("ValidationRuleRow", rule, new ViewDataDictionary { 
     TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = string.Format("Rules[{0}]", i) } }) 
    i++; 
} 

jestem w stanie ustawić HtmlFieldPrefix celu umożliwienia odpowiedniego modelu wiążące.

chcę użytkownika, aby móc dodać nowy ValidationRuleRow na bieżąco za pośrednictwem ajax, jak:

$.ajax({ 
    type: "GET", 
    url: "/Monitors/NewMonitorValidationRule", 
    success: function (data, textStatus, jqXHR) { 
     var element = $(data); 
     $("#ValidationRuleContainer").append(element); 
    } 
}); 

Mam więc działanie w moim kontrolera, aby uzyskać HTML:

public ActionResult NewMonitorValidationRule() 
{ 
    ValidationRule rule = new ValidationRule{Id = TempSurrogateKey.Next}; 
    var view = PartialView("ValidationRuleRow", rule); 
    // CODE TO SET PartialView field prefix 
    return view; 
} 

Zwrócony kod HTML nie ma prefiksu. Czy jest mimo to ustawić prefiks podczas wywoływania PartialView z Akcja w kontroler?

Odpowiedz

20

Jeszcze lepiej, można ustawić ViewData.TemplateInfo.HtmlFieldPrefix wewnątrz działania kontrolera,

public Actionresult MyAction() 
{ 
    ... 
    ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix"; 

    return PartialView("MyView", viewmodel); 
} 

Nie ma potrzeby korzystania z ViewBag lub właściwości w modelu widoku.

+2

Dałem ci nagrodę za ten, dobrze grany. –

+1

Wielkie dzięki, zaskoczył mnie tam :) –

+0

Z wyjątkiem czasami wejściowe 'atrybutów id' nie będzie renderować ... Zobacz [moje pytanie] (http://stackoverflow.com/questions/38638451/aspnet-mvc-5 -html-helper-action-method-view-results-input-id-missing-sometimes) – ooXei1sh

18

Można by przekazać tę informację wraz jako część modelu widoku:

public ActionResult NewMonitorValidationRule() 
{ 
    ValidationRule rule = new ValidationRule{Id = TempSurrogateKey.Next}; 
    // CODE TO SET PartialView field prefix 
    rule.MyPrefix = "Rule[153]"; 
    return PartialView("ValidationRuleRow", rule); 
} 

i wewnątrz częściowy widok ValidationRuleRow.cshtml wykorzystania tej właściwości widoku modelu ustawić prefix:

@{ 
    if (!string.IsNullOrEmpty(Model.MyPrefix)) 
    { 
     ViewData.TemplateInfo.HtmlFieldPrefix = Model.MyPrefix; 
    } 
} 
+0

Dobra rozmowa. Skończyło się na użyciu ViewBag zamiast dodać go do modelu widoku, ale to obejście jest wystarczające. Dzięki. –

+0

Dzięki, to działa! ;) –

Powiązane problemy