ASP.NET MVC3在调用Controller.PartialView时添加HtmlFieldPrefix

Mic*_*son 21 asp.net-mvc-3

我将部分视图呈现为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++;
}
Run Code Online (Sandbox Code Playgroud)

我能够设置HtmlFieldPrefix以允许正确的模型绑定.

我希望用户能够通过ajax动态添加新的ValidationRuleRow,如:

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

所以我在我的控制器中有一个动作来获取HTML:

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

返回的HTML没有前缀.无论如何在从Controller中的Action调用PartialView时设置前缀?

Tho*_*der 28

更好的是,你可以在控制器动作中设置ViewData.TemplateInfo.HtmlFieldPrefix,

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

   return PartialView("MyView", viewmodel);
}
Run Code Online (Sandbox Code Playgroud)

视图模型中不需要ViewBag或属性.

  • 给你一个赏金,很好玩. (2认同)

Dar*_*rov 18

您可以将此信息作为视图模型的一部分传递:

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

在局部视图内部ValidationRuleRow.cshtml使用此视图模型属性来设置前缀:

@{
    if (!string.IsNullOrEmpty(Model.MyPrefix))
    {
        ViewData.TemplateInfo.HtmlFieldPrefix = Model.MyPrefix;
    }
}
Run Code Online (Sandbox Code Playgroud)