ASP.MVC 3 Razor在Html.PartialView扩展中添加模型前缀

Iva*_*tin 7 razor asp.net-mvc-3

我有与ASP.NET MVC部分视图一样大致相同的问题:输入名称前缀

我想为这些数据实体创建CRUD操作:

public class UserViewModel 
{  
   protected virtual Id {get; set;} 
   public virtual string Login { get; set; }
   public virtual string Password { get; set; }
   public virtual ZipCodeViewModel ZipCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

邮政编码实体:

public class ZipCodeViewModel
{        
   public virtual string City { get; set; }

   public virtual string State { get; set; }           

   public virtual string Zip { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我也有部分视图ZipCode使用UserViewModel.ZipCode:

@model ZipCodeViewModel    

    @Html.TextBoxFor(x => x.Zip, new { id = "ZipCode", name = "ZipCode.Zip", maxlength = "5" })     
Run Code Online (Sandbox Code Playgroud)

我将在另一个页面(例如用户)中使用ZipCodePartialView.

@model UserViewModel
.....
@{Html.RenderPartial("Zipcode", Model.ZipCode);}
Run Code Online (Sandbox Code Playgroud)

当MVC保存用户ZipCode字段Zip为空时.

那么问题是我如何在patrial View中添加模型前缀?

bre*_*eez 14

试试这个扩展:

public static void RenderPartialWithPrefix(this HtmlHelper helper, string partialViewName, object model, string prefix)
        {
            helper.RenderPartial(partialViewName,
                                 model,
                                 new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = prefix } });
        }
Run Code Online (Sandbox Code Playgroud)


Sea*_*ver 10

而不是使用Html.RenderPartial()将您的局部视图放在Shared/EditorTemplates /中,并将其命名为类型的名称(在本例中ZipCodeViewModel).然后,您可以使用Html.EditorFor()表达式中的属性传递.EditorFor()正确填充字段前缀,以便MVC中的模型绑定器可以正确地放置数据.

所以这样的事情

@model UserViewModel
.....
@Html.EditorFor(m => m.ZipCode);
Run Code Online (Sandbox Code Playgroud)

我会尝试挖掘一些链接和资源,但希望能为你找到答案.

编辑:这篇博文似乎超越了EditorFor()扩展和EditorTempaltes的基础知识:关于ASP.NET MVC的快速提示:编辑器Tempaltes

无论如何,当您使用这些Html.TextBoxFor()Html.DropDownFor()扩展时,他们所做的是从您传入的表达式中获取属性的全名,并将HTML输入元素的名称和id属性设置为该属性.示例可能是:

@Html.TextBoxFor(m => m.Person.FirstName)
Run Code Online (Sandbox Code Playgroud)

会呈现

<input id="Person_FirstName" name="Person.FirstName" type="text" value="<what ever was in FirstName>" />
Run Code Online (Sandbox Code Playgroud)

这些输入名称和值是后期数据中的键/值对.默认的ASP.NET MVC模型绑定器会尝试将这些键与控制器操作所采用的模型进行匹配.如果找到匹配项,则会设置该值.

所以你上面的问题可能是因为你的局部视图中的输入名称来自ZipCodeViewModel向下,但是你的行动正在接受UserViewModel.该EditorFor()前缀为您的名字,因此它可以基本上呈现将发布可绑定你的数据备份的局部视图.虽然您可以在输入元素上自己设置名称属性(或者按照您在评论中的建议展平所有内容),但是这些帮助程序会为您执行此操作.

我希望这有助于解释正在发生的事情以及可能的解决方案.