2011-07-07 15 views
19

Estoy representando una vista parcial como parte de una solicitud de Ajax.ASP.NET MVC3 agregue un HtmlFieldPrefix al llamar a Controller.PartialView

Cuando llamo a la vista parcial desde un punto de vista:

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++; 
} 

soy capaz de establecer el HtmlFieldPrefix para permitir la encuadernación modelo adecuado.

Quiero que el usuario sea capaz de añadir un nuevo ValidationRuleRow sobre la marcha a través de AJAX, como:

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

Así que tienen una acción en mi regulador para obtener el código HTML:

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

El HTML devuelto no tiene un prefijo. ¿Hay alguna forma de establecer un prefijo al llamar a un Vista parcial desde una acción en un controlador?

Respuesta

20

Aún mejor, puede establecer ViewData.TemplateInfo.HtmlFieldPrefix dentro de la acción del controlador,

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

    return PartialView("MyView", viewmodel); 
} 

No hay necesidad de ViewBag o una propiedad en su modelo de vista.

+2

Te di una recompensa por eso, bien jugado. –

+1

Muchas gracias, me pilló por sorpresa :) –

+0

Excepto que a veces los atributos 'id 'no se mostrarán ... Ver [mi pregunta] (http://stackoverflow.com/questions/38638451/aspnet-mvc-5 -html-helper-action-method-view-results-input-id-missing-sometimes) – ooXei1sh

18

Usted podría pasar esta información como parte del modelo de vista:

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

y dentro del parciales uso vista ValidationRuleRow.cshtml esta propiedad vista del modelo para establecer el prefijo:

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

Buena llamada. Terminé usando ViewBag en lugar de agregarlo al modelo de vista, pero esta solución es suficiente. Gracias. –

+0

¡Gracias, es trabajo! ;) –

Cuestiones relacionadas