Asp.net mvc MVC 5和复杂类型列表

Asp.net mvc MVC 5和复杂类型列表,asp.net-mvc,list,model-binding,Asp.net Mvc,List,Model Binding,我已经检查了以及其他一些关于这个主题的帖子 我还是宁愿问这个问题,为了理解而不是简单地复制粘贴答案 我有一个复杂类型,如下所示: public interface ICaracteristic { int value { get; set; } int max { get; set; } string name { get; set; } } public class BaseAttributes : ICaracteristic { public int m

我已经检查了以及其他一些关于这个主题的帖子

我还是宁愿问这个问题,为了理解而不是简单地复制粘贴答案

我有一个复杂类型,如下所示:

public interface ICaracteristic
{
    int value { get; set; }
    int max { get; set; }
    string name { get; set; }
}

 public class BaseAttributes : ICaracteristic
{
    public int max { get; set; }
    public int value { get; set; }
    public string name { get; set; }
    Random r = new Random();
}
以及使用这些类型的倍数列表的对象:

public class Character
{
    // Infos
    public string characterName { get; set; }
    public string playerName { get; set; }
    public IGame game { get; set; }
    // Caracteristics
    public List<ICaracteristic> baseAttr { get; set; }
    public List<ICaracteristic> skills { get; set; }
    public List<ICaracteristic> stats { get; set; }
    public List<ICaracteristic> spendPoints { get; set; }
}
这显然失败了,因为名称为“null”

我只在“基本属性”部分将“foreach”更改为“for”。在该部分中,所有名称都设置为null。在其他部分中,不取任何值


有什么想法吗

既然Stephen Muecke不在乎名声:

--不能将模型绑定到接口

--因为modelbinder需要索引,所以不能对列表执行foreach

--您需要对每个要使用的值进行“控制”排序,因此对于复杂类型,甚至在显示名称上也需要一个

一个好的解决方案是执行for循环,在该循环中,除了@Html.DisplayFor之外,还包括一个@Html.Hiddenfor,以便显示名称不可编辑,但仍有一个控件。
对于接口和modelbinder缺乏交互,唯一的解决方案是使用接口的实现。遗憾的是。

您无法绑定到接口(
DefaultModelBinder
无法初始化接口实例)。您需要一个
for
循环(或自定义
EditorTemplate
)-一个
foreach
循环将不起作用-请参阅。您可以创建一个自定义的
ModelBinder
来处理接口,但是您还需要发布一些值来指示要使用的具体实现initialize@StephenMuecke因此,如果我将角色模型中的“List baseAttr”替换为“List baseAttr”,它应该可以工作?是的,只要您使用
for
循环(或者对于
BaseAttributes
类型的自定义
EditorTempate
,并在主视图中使用
@Html.EditorFor(m=>m.baseAttr)
所以我必须在我使用接口的每个地方强式键入,并在for循环中更改foreach。好吧,这对接口来说有点糟糕:-/我试试这个。@StephenMuecke好吧,我试着用它的实现替换接口的每一次出现:的确,表单采用了ICaracteristic的值,但它不采用它的名称a纽约(--')。你知道是什么引起的吗?
   @model RPGmvc.Models.Character
 @using (Html.BeginForm())
 {
@Html.AntiForgeryToken()
    <h4>Character @Html.TextBoxFor(model => model.characterName)</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

<div class="row">
    <!--SECTION BASE ATTRIBUTES-->
    <div class="col-md-3">


        <!-- @foreach (var item in Model.baseAttr)
        {
            <div>
                <label>@Html.DisplayFor(model => item.name)</label>
                <p>@Html.EditorFor(model => item.value, new { @class = "form-control" })</p>
            </div>
        } 
@model RPGmvc.Models.Caracteristic.ICaracteristic

<p>
    @Html.DisplayFor(m => m.name)
    @Html.DisplayFor(m => m.value)
</p>
foreach (ICaracteristic battr in myCharac.baseAttr)
        {
            var currentNode = myDoc.SelectSingleNode("/character_sheet/base_attributes/" + battr.name.Replace(" ", "_").ToLower());
            currentNode.InnerText = battr.value.ToString();
        }