ASP.NET MVC3 добавляет HtmlFieldPrefix при вызове Controller.PartialView
Я представляю частичное представление как часть запроса Ajax.
Когда я вызываю частичный вид из представления:
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++;
}
Я могу установить HtmlFieldPrefix, чтобы разрешить привязку модели.
Я хочу, чтобы пользователь мог добавить новый ValidationRuleRow на лету через ajax, например:
$.ajax({
type: "GET",
url: "/Monitors/NewMonitorValidationRule",
success: function (data, textStatus, jqXHR) {
var element = $(data);
$("#ValidationRuleContainer").append(element);
}
});
Итак, у меня есть действие в моем контроллере, чтобы получить HTML:
public ActionResult NewMonitorValidationRule()
{
ValidationRule rule = new ValidationRule{Id = TempSurrogateKey.Next};
var view = PartialView("ValidationRuleRow", rule);
// CODE TO SET PartialView field prefix
return view;
}
Возвращенный HTML не имеет префикса. Нужно ли в любом случае устанавливать префикс при вызове PartialView из действия в контроллере?
Ответы
Ответ 1
Еще лучше, вы можете установить ViewData.TemplateInfo.HtmlFieldPrefix внутри действия контроллера,
public Actionresult MyAction()
{
...
ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
return PartialView("MyView", viewmodel);
}
В вашей модели просмотра нет необходимости в ViewBag или в качестве свойства.
Ответ 2
Вы можете передать эту информацию вместе с частью модели представления:
public ActionResult NewMonitorValidationRule()
{
ValidationRule rule = new ValidationRule{Id = TempSurrogateKey.Next};
// CODE TO SET PartialView field prefix
rule.MyPrefix = "Rule[153]";
return PartialView("ValidationRuleRow", rule);
}
и внутри частичного представления ValidationRuleRow.cshtml
используйте это свойство модели представления, чтобы установить префикс:
@{
if (!string.IsNullOrEmpty(Model.MyPrefix))
{
ViewData.TemplateInfo.HtmlFieldPrefix = Model.MyPrefix;
}
}